【问题标题】:How to rename JSON key如何重命名 JSON 密钥
【发布时间】:2012-11-03 16:51:01
【问题描述】:

我有一个包含以下内容的 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 来做到这一点?

谢谢。

【问题讨论】:

标签: json


【解决方案1】:
  1. 解析 JSON
const arr = JSON.parse(json);
  1. 对于 JSON 中的每个对象,重命名键:
obj.id = obj._id;
delete obj._id;
  1. 字符串化结果

大家一起:

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

【讨论】:

  • 如果我想将更改应用到 json 中的所有 _id 怎么办?
  • @truongnm 循环它
  • 如果你想要有空格的键,你可以像这样添加它 obj["my id"] = obj.id
【解决方案2】:

在这种情况下,最容易使用字符串替换。序列化 JSON 将无法正常工作,因为 _id 将成为对象的属性名称,并且更改属性名称并非易事(至少在大多数语言中不是这样,在 javascript 中还不错)。而是这样做;

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

【讨论】:

  • 如果他有参数"whereToFindIdentification":"id"怎么办?它从来都不是最好的方法。
  • @Kamil 在正则表达式右侧包含冒号,与您的示例不匹配。它意味着一个名为 id 的字段,而不是一个值。
【解决方案3】:

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

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

【讨论】:

  • 非常感谢陌生人先生,这对我很有帮助。
  • 简洁、简短且解释清楚。太好了!
【解决方案4】:

试试这个:

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

【讨论】:

    【解决方案5】:

    如果您想重命名某个键的所有出现,您可以使用带有 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);
    

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

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

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

    并返回json格式:

    json = JSON.parse(str);
    

    现在我们有了带有所需键名的 json。

    【讨论】:

    • 如果任何地方有一个值包含您要替换的键名,这将不起作用,因为它也会替换它。
    • 好点,但边缘情况。替换文字时总是需要小心
    【解决方案6】:

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

    在复活功能中:

    • 如果我们返回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)
    

    输出:

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

    【讨论】:

    • 这对我来说似乎是最正确和最干净的答案。它在解析阶段处理问题,而不是像所有其他人那样事后处理。尽管可能需要一些基准测试,但它似乎也是最快的。
    【解决方案7】:

    通过使用地图功能,您可以做到这一点。 请参考以下代码。

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

    【讨论】:

      【解决方案8】:

      可以,使用 typeScript

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

      示例:https://codepen.io/lelogualda/pen/BeNwWJ

      【讨论】:

        【解决方案9】:

        如果你的对象看起来像这样:

        obj = {
            "_id":"5078c3a803ff4197dc81fbfb",
            "email":"user1@gmail.com",
            "image":"some_image_url",
            "name":"Name 1"
           }
        

        JavaScript 中最简单的方法可能是:

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

        结果,你会得到:

        obj = {
            "id":"5078c3a803ff4197dc81fbfb",
            "email":"user1@gmail.com",
            "image":"some_image_url",
            "name":"Name 1"
           }
        

        【讨论】:

          【解决方案10】:

          如果有人需要动态执行此操作:

          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 现在将拥有新密钥。

          重要提示:

          如果replace 函数没有更改您的密钥,它只会将其从数组中取出。你可能想在里面放一些if 语句。

          【讨论】:

            【解决方案11】:

            如果要替换 JSON 对象的键,请使用以下逻辑

            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)

            【讨论】:

              【解决方案12】:

              如果您想动态地执行此操作,例如,您有一个数组,您想将其用作 JSON 对象的键:

              你的数组会是这样的:

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

              现在你有一个像这样的 JSON 数组:

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

              您生成的 JSON 数组将如下所示:

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

              【讨论】:

                【解决方案13】:

                试试这个

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

                【讨论】:

                  猜你喜欢
                  • 2018-06-14
                  • 2014-07-30
                  • 1970-01-01
                  • 2018-04-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-04-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多