duy
duy

Reputation: 1920

How to rename JSON key

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.

Upvotes: 102

Views: 236947

Answers (16)

Thang Tran
Thang Tran

Reputation: 321

My case:

renameJsonKey(json, oldKey, newKey) {
    Map<String, dynamic> newJson = {};
    json.forEach((key, value) {
      if (key == oldKey) {
        newJson.addAll({newKey: json[key]});
      } else {
        newJson.addAll({key: json[key]});
      }
    });
    return newJson;
  }

Change many keys:

renameJsonKeys(json, List<String> oldKeys, List<String> newKeys) {
  Map<String, dynamic> newJson = json;
  for (var i = 0; i < oldKeys.length; i++) {
    newJson = renameJsonKey(newJson, oldKeys[i], newKeys[i]);
  }
  return newJson;
}

Upvotes: 0

Mark Liu
Mark Liu

Reputation: 99

My answer works for nested json like this,


[
  {
    "id": 1,
    "name": "1111111111",
    "children": [
      {
        "id": 2,
        "name": "2222",
      }
    ]
  },
  {
    "id": 3,
    "name": "1",
  },
]

I want replace key 'id' to 'value', and 'name' to 'label' for select componet.

Function:

function renameKeyInJson(json, keys) {
  let dataStr = JSON.stringify(json);
  keys.forEach(e => {
    dataStr = dataStr.replace(new RegExp(`"${e.oldKey}":`, "g"), `"${e.newKey}":`);
  });
  return JSON.parse(dataStr);
}

Usage:

const response = await getAll(bookId);
return renameKeyInJson(response.data, [
  {oldKey: 'name', newKey: 'label'},
  {oldKey: 'id', newKey: 'value'},
]);

Upvotes: 1

Shreyak Upadhyay
Shreyak Upadhyay

Reputation: 439

To update oldKey with a newKey in a nested json at any deeper level.

function transformKeys(object, newKey, oldKey) {
    if(Array.isArray(object)){
        object.map((item) => {
            transformKeys(item, newKey, oldKey)
        })
    }
    if(typeof object === 'object' && !Array.isArray(object)){
        Object.keys(object).forEach(key => {
            if (typeof object[key] === 'object') {
                transformKeys(object[key], newKey, oldKey)
            }
            if (key === oldKey) {
                object[newKey] = object[key]
                delete object[key]
            }
        })
    }
}

Upvotes: 0

RustyH
RustyH

Reputation: 482

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;
}

Upvotes: -1

Pylon
Pylon

Reputation: 768

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"}]

Upvotes: 25

Appi Devu
Appi Devu

Reputation: 43

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)

Upvotes: 1

trojek
trojek

Reputation: 3228

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"
   }

Upvotes: 2

Paul
Paul

Reputation: 141829

  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 );

Upvotes: 116

LukeVenter
LukeVenter

Reputation: 509

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.

Upvotes: 3

user7246161
user7246161

Reputation: 267

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);

Upvotes: 13

Jitendra Pawar
Jitendra Pawar

Reputation: 1321

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);

Upvotes: 3

Aurelio Gualda
Aurelio Gualda

Reputation: 57

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

Upvotes: 4

evanmcdonnal
evanmcdonnal

Reputation: 48076

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\":");

Upvotes: 32

Sufiyan Ansari
Sufiyan Ansari

Reputation: 1946

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
  }
]

Upvotes: -1

RafaelJan
RafaelJan

Reputation: 3608

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.

Upvotes: 8

Stranger
Stranger

Reputation: 10610

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.

Upvotes: 27

Related Questions