Reputation: 1920
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
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
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
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
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
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:
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
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
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
Reputation: 141829
const arr = JSON.parse(json);
obj.id = obj._id;
delete obj._id;
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
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
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
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
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
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
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
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
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