如何重命名JSON密钥

duy*_*duy 64 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"
  }
]
Run Code Online (Sandbox Code Playgroud)

我想将"_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"
  }
]
Run Code Online (Sandbox Code Playgroud)

我怎么能用Javascript,jQuery或Ruby,Rails做到这一点?

谢谢.

Pau*_*aul 86

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

var obj = JSON.parse(json)[0];
obj.id = obj._id;
delete obj._id;

json = JSON.stringify([obj]);
Run Code Online (Sandbox Code Playgroud)

这会将json更改为:

[{"email":"user1@gmail.com","image":"some_image_url","name":"Name 1","id":"5078c3a803ff4197dc81fbfb"}]
Run Code Online (Sandbox Code Playgroud)

由于顺序在JSON中的名称/值对中没有意义,因此这与您想要的结果相同.

  • 如果我想在json中对所有_id应用更改怎么办? (4认同)
  • 另外,如果你想有带空格的键,你可以像这样添加它 obj["my id"] = obj.id (2认同)

eva*_*nal 25

在这种情况下,最简单的方法是使用字符串替换.序列化JSON将无法正常工作,因为_id将成为对象的属性名称,更改属性名称不是一项简单的任务(至少在大多数语言中都没有,在javascript中也不是那么糟糕).而只是做;

jsonString = jsonString.replace("\"_id\":", "\"id\":");
Run Code Online (Sandbox Code Playgroud)

  • 如果他有参数 `"whereToFindIdentification":"id"` 呢?这从来都不是最好的方式。 (4认同)
  • @Kamil 在正则表达式中包含右侧的冒号,与您的示例不匹配。它意味着一个名为 id 的字段,而不是一个值。 (4认同)

Str*_*ger 16

正如evanmcdonnal所提到的,最简单的解决方案是将其作为字符串而不是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));
Run Code Online (Sandbox Code Playgroud)

这会将给定的JSON数据转换为字符串,并将"_id"替换为"id",然后将其转换回所需的JSON格式.但我使用splitjoin不是replace,因为replace只会替换第一次出现的字符串.


Ref*_*Jan 6

如果你想重命名某个键的所有出现,你可以使用带有 g 选项的正则表达式。例如:

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);
Run Code Online (Sandbox Code Playgroud)

现在我们在str中有字符串格式的json。

使用带有g选项的正则表达式将所有出现的“_id”替换为“id” :

str = str.replace(/\"_id\":/g, "\"id\":");
Run Code Online (Sandbox Code Playgroud)

并返回json格式:

json = JSON.parse(str);
Run Code Online (Sandbox Code Playgroud)

现在我们有了我们想要的密钥名称的 json。

  • 如果任何地方都有一个包含您要替换的键名的值,这将不起作用,因为它也会替换它。 (3认同)

Pyl*_*lon 6

JSON.parse有两个参数。第二个参数reviver是一个转换函数,可以格式化输出我们想要的格式。请参阅此处的ECMA 规范。

在复活功能中:

  • 如果我们返回 undefined,原始属性将被删除。
  • this 是包含作为此函数处理的属性的对象,属性名称作为字符串,属性值作为此函数的参数。
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)
Run Code Online (Sandbox Code Playgroud)

输出:

[{"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"}]
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说似乎是最正确、最干净的答案。它在解析阶段就处理问题,而不是像其他所有那样事后处理。它似乎也是最快的,尽管可能需要一些基准测试。 (6认同)

use*_*161 5

尝试这个:

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);
Run Code Online (Sandbox Code Playgroud)