How to rename JSON key

Json

Json Problem Overview


I have a JSON object with the following content:

[
  {
    "_id":"5078c3a803ff4197dc81fbfb",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 1"
  },
  {
    "_id":"5078c3a803ff4197dc81fbfc",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 2"
  }
]

I want to change the "_id" key to "id" so it would become

[
  {
    "id":"5078c3a803ff4197dc81fbfb",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 1"
  },
  {
    "id":"5078c3a803ff4197dc81fbfc",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 2"
  }
]

How would I do that either with Javascript, jQuery or Ruby, Rails?

Thanks.

Json Solutions


Solution 1 - Json

  1. Parse the JSON
const arr = JSON.parse(json);
  1. For each object in the JSON, rename the key:
obj.id = obj._id;
delete obj._id;
  1. Stringify the result

All together:

function renameKey ( obj, oldKey, newKey ) {
  obj[newKey] = obj[oldKey];
  delete obj[oldKey];
}

const json = `
  [    {      "_id":"5078c3a803ff4197dc81fbfb",      "email":"[email protected]",      "image":"some_image_url",      "name":"Name 1"    },    {      "_id":"5078c3a803ff4197dc81fbfc",      "email":"[email protected]",      "image":"some_image_url",      "name":"Name 2"    }  ]
`;
   
const arr = JSON.parse(json);
arr.forEach( obj => renameKey( obj, '_id', 'id' ) );
const updatedJson = JSON.stringify( arr );

console.log( updatedJson );

Solution 2 - Json

In this case it would be easiest to use string replace. Serializing the JSON won't work well because _id will become the property name of the object and changing a property name is no simple task (at least not in most langauges, it's not so bad in javascript). Instead just do;

jsonString = jsonString.replace("\"_id\":", "\"id\":");

Solution 3 - Json

As mentioned by evanmcdonnal, the easiest solution is to process this as string instead of JSON,

var json = [{"_id":"5078c3a803ff4197dc81fbfb","email":"[email protected]","image":"some_image_url","name":"Name 1"},{"_id":"5078c3a803ff4197dc81fbfc","email":"[email protected]","image":"some_image_url","name":"Name 2"}];
    
json = JSON.parse(JSON.stringify(json).split('"_id":').join('"id":'));

document.write(JSON.stringify(json));

This will convert given JSON data to string and replace "_id" to "id" then converting it back to the required JSON format. But I used split and join instead of replace, because replace will replace only the first occurrence of the string.

Solution 4 - Json

Try this:

let jsonArr = [
    {
        "_id":"5078c3a803ff4197dc81fbfb",
        "email":"[email protected]",
        "image":"some_image_url",
        "name":"Name 1"
    },
    {
        "_id":"5078c3a803ff4197dc81fbfc",
        "email":"[email protected]",
        "image":"some_image_url",
        "name":"Name 2"
    }
]

let idModified = jsonArr.map(
    obj => {
        return {
            "id" : obj._id,
            "email":obj.email,
            "image":obj.image,
            "name":obj.name
        }
    }
);
console.log(idModified);

Solution 5 - Json

JSON.parse has two parameters. The second parameter, reviver, is a transform function that can format the output format we want. See ECMA specification here.

In reviver function:

  • if we return undefined, the original property will be deleted.
  • this is the object containing the property being processed as this function, and the property name as a string, the property value as arguments of this function.
const json = '[{"_id":"5078c3a803ff4197dc81fbfb","email":"[email protected]","image":"some_image_url","name":"Name 1"},{"_id":"5078c3a803ff4197dc81fbfc","email":"[email protected]","image":"some_image_url","name":"Name 2"}]';

const obj = JSON.parse(json, function(k, v) {
    if (k === "_id") {
        this.id = v;
        return; // if return  undefined, orignal property will be removed
    }
    return v;
});

const res = JSON.stringify(obj);
console.log(res)

output:

[{"email":"[email protected]","image":"some_image_url","name":"Name 1","id":"5078c3a803ff4197dc81fbfb"},{"email":"[email protected]","image":"some_image_url","name":"Name 2","id":"5078c3a803ff4197dc81fbfc"}]

Solution 6 - Json

If you want to rename all occurrences of some key you can use a regex with the g option. For example:

var json = [{"_id":"1","email":"[email protected]","image":"some_image_url","name":"Name 1"},{"_id":"2","email":"[email protected]","image":"some_image_url","name":"Name 2"}];

str = JSON.stringify(json);

now we have the json in string format in str.

Replace all occurrences of "_id" to "id" using regex with the g option:

str = str.replace(/\"_id\":/g, "\"id\":");

and return to json format:

json = JSON.parse(str);

now we have our json with the wanted key name.

Solution 7 - Json

By using map function you can do that. Please refer below code.

var userDetails = [{
  "_id":"5078c3a803ff4197dc81fbfb",
  "email":"[email protected]",
  "image":"some_image_url",
  "name":"Name 1"
},{
  "_id":"5078c3a803ff4197dc81fbfc",
  "email":"[email protected]",
  "image":"some_image_url",
  "name":"Name 2"
}];

var formattedUserDetails = userDetails.map(({ _id:id, email, image, name }) => ({
  id,
  email,
  image,
  name
}));
console.log(formattedUserDetails);

Solution 8 - Json

If your object looks like this:

obj = {
    "_id":"5078c3a803ff4197dc81fbfb",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 1"
   }

Probably the simplest method in JavaScript is:

obj.id = obj._id
del object['_id']

As a result, you will get:

obj = {
    "id":"5078c3a803ff4197dc81fbfb",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 1"
   }

Solution 9 - Json

Is possible, using typeScript

function renameJson(json,oldkey,newkey) {    
 return Object.keys(json).reduce((s,item) => 
      item == oldkey ? ({...s,[newkey]:json[oldkey]}) : ({...s,[item]:json[item]}),{})   
}

Example: https://codepen.io/lelogualda/pen/BeNwWJ

Solution 10 - Json

If anyone needs to do this dynamically:

const keys = Object.keys(jsonObject);

keys.forEach((key) => {

      // CREATE A NEW KEY HERE
      var newKey = key.replace(' ', '_');
   
      jsonObject[newKey] = jsonObject[key];
      delete jsonObject[key];
   });

jsonObject will now have the new keys.

IMPORTANT:

If your key is not changed by the replace function, it will just take it out of the array. You may want to put some if statements in there.

Solution 11 - Json

If you want replace the key of JSON object, use below logic

const student= {
  "key": "b9ed-9c1a04247482",
  "name": "Devaraju",
  "DOB" : "01/02/2000",
  "score" : "A+"
}
let {key, ...new_student} = {...student}
new_student.id= key

console.log(new_student)

Solution 12 - Json

try this

function renameKey ( obj, oldKey, newKey ) {
  obj[newKey] = obj[oldKey];
  delete obj[oldKey];
}

Solution 13 - Json

If you want to do it dynamically, for example, you have an array which you want to apply as a key to JSON object:

your Array will be like :

var keys = ["id", "name","Address","Phone"] // The array size should be same as JSON Object keys size

Now you have a JSON Array like:

var jArray = [
  {
    "_id": 1,
    "_name": "Asna",
    "Address": "NY",
    "Phone": 123
  },
  {
    "_id": 2,
    "_name": "Euphoria",
    "Address": "Monaco",
    "Phone": 124
  },
  {
    "_id": 3,
    "_name": "Ahmed",
    "Address": "Mumbai",
    "Phone": 125
  }
]

$.each(jArray ,function(pos,obj){
	var counter = 0;
	$.each(obj,function(key,value){
		jArray [pos][keys[counter]] = value;
		delete jArray [pos][key];
		counter++;
	})	
})

Your resultant JSON Array will be like :

[  {    "id": 1,    "name": "Asna",    "Address": "NY",    "Phone": 123  },  {    "id": 2,    "name": "Euphoria",    "Address": "Monaco",    "Phone": 124  },  {    "id": 3,    "name": "Ahmed",    "Address": "Mumbai",    "Phone": 125  }]

Solution 14 - Json

For a more flexible solution for renaming a key in an object,

Usage:

jsondata = renameKey(jsondata,"_id","id");

Function:

function renameKey(data,oldname,newname)
{
    for (let i = 0; i < data.length; i++) {
        let element = data[i];
        element[newname] = element[oldname];
        delete element[oldname];
    }
    return data;
}

if you need the keys to stay in the same order (like i did) here is a messy solution that I'm sure is poorly optimized.

function renameKey(data,oldname,newname)
{
    for (let i = 0; i < data.length; i++)
    {
        let element = data[i];
        let info = Object.keys(data[i]);

        for (let ii = 0; ii < info.length; ii++)
        {

            let key = info[ii];
            if (key !== oldname)
            {
                let skey = key + "~"; //make temporary key
                element[skey] = element[key]; //copy values to temp key
                delete element[key]; //delete old key
                element[key] = element[skey]; //copy key back to orginal name, preserving its position.
                delete element[skey]; //delete temp key
            }
            else
            {
                element[newname] = element[key];
                delete element[key];
            }
        }
    }
    return data;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionduyView Question on Stackoverflow
Solution 1 - JsonPaulView Answer on Stackoverflow
Solution 2 - JsonevanmcdonnalView Answer on Stackoverflow
Solution 3 - JsonStrangerView Answer on Stackoverflow
Solution 4 - Jsonuser7246161View Answer on Stackoverflow
Solution 5 - JsonPylonView Answer on Stackoverflow
Solution 6 - JsonRafaelJanView Answer on Stackoverflow
Solution 7 - JsonJitendra PawarView Answer on Stackoverflow
Solution 8 - JsontrojekView Answer on Stackoverflow
Solution 9 - JsonAurelio GualdaView Answer on Stackoverflow
Solution 10 - JsonLukeVenterView Answer on Stackoverflow
Solution 11 - JsonAppi DevuView Answer on Stackoverflow
Solution 12 - JsonMD SHAYONView Answer on Stackoverflow
Solution 13 - JsonSufiyan AnsariView Answer on Stackoverflow
Solution 14 - JsonRustyHView Answer on Stackoverflow