如何重命名 JSON 密钥

我有一个 JSON 对象,其内容如下:

[
{
"_id":"5078c3a803ff4197dc81fbfb",
"email":"user1@gmail.com",
"image":"some_image_url",
"name":"Name 1"
},
{
"_id":"5078c3a803ff4197dc81fbfc",
"email":"user2@gmail.com",
"image":"some_image_url",
"name":"Name 2"
}
]

我想将“ _ id”键更改为“ id”,这样它就会变成

[
{
"id":"5078c3a803ff4197dc81fbfb",
"email":"user1@gmail.com",
"image":"some_image_url",
"name":"Name 1"
},
{
"id":"5078c3a803ff4197dc81fbfc",
"email":"user2@gmail.com",
"image":"some_image_url",
"name":"Name 2"
}
]

如何使用 Javascript、 jQuery 或 Ruby、 Rails 实现这些功能呢?

谢谢。

196753 次浏览

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\":");
  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":"user1@gmail.com",
"image":"some_image_url",
"name":"Name 1"
},
{
"_id":"5078c3a803ff4197dc81fbfc",
"email":"user2@gmail.com",
"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 );

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

var json = [{"_id":"5078c3a803ff4197dc81fbfb","email":"user1@gmail.com","image":"some_image_url","name":"Name 1"},{"_id":"5078c3a803ff4197dc81fbfc","email":"user2@gmail.com","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.

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":"user1@gmail.com","image":"some_image_url","name":"Name 1"},{"_id":"2","email":"user2@gmail.com","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.

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

If your object looks like this:

obj = {
"_id":"5078c3a803ff4197dc81fbfb",
"email":"user1@gmail.com",
"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":"user1@gmail.com",
"image":"some_image_url",
"name":"Name 1"
}

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

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

var userDetails = [{
"_id":"5078c3a803ff4197dc81fbfb",
"email":"user1@gmail.com",
"image":"some_image_url",
"name":"Name 1"
},{
"_id":"5078c3a803ff4197dc81fbfc",
"email":"user2@gmail.com",
"image":"some_image_url",
"name":"Name 2"
}];


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

Try this:

let jsonArr = [
{
"_id":"5078c3a803ff4197dc81fbfb",
"email":"user1@gmail.com",
"image":"some_image_url",
"name":"Name 1"
},
{
"_id":"5078c3a803ff4197dc81fbfc",
"email":"user2@gmail.com",
"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);

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":"user1@gmail.com","image":"some_image_url","name":"Name 1"},{"_id":"5078c3a803ff4197dc81fbfc","email":"user2@gmail.com","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":"user1@gmail.com","image":"some_image_url","name":"Name 1","id":"5078c3a803ff4197dc81fbfb"},{"email":"user2@gmail.com","image":"some_image_url","name":"Name 2","id":"5078c3a803ff4197dc81fbfc"}]

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.

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)

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

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

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'},
]);