【问题标题】:Change key name in nested JSON structure更改嵌套 JSON 结构中的键名
【发布时间】:2012-11-22 19:08:36
【问题描述】:

我有一个如下所示的JSON数据结构:

{
    "name": "World",
    "children": [
      { "name": "US",
          "children": [
           { "name": "CA" },
           { "name": "NJ" }
         ]
      },
      { "name": "INDIA",
          "children": [
          { "name": "OR" },
          { "name": "TN" },
          { "name": "AP" }
         ]
      }
 ]
};

我需要将键名从“name”和“children”更改为“key”和“value”。关于如何为这个嵌套结构中的每个键名执行此操作的任何建议?

【问题讨论】:

  • 您希望何时/在何处进行更改?
  • ...为什么结尾有分号?您在问题中究竟代表什么?

标签: javascript json


【解决方案1】:

我不知道为什么您的 JSON 标记末尾有分号(假设这就是您在问题中所表示的内容),但如果将其删除,那么您可以使用reviver 函数在解析数据时进行修改。

var parsed = JSON.parse(myJSONData, function(k, v) {
    if (k === "name") 
        this.key = v;
    else if (k === "children")
        this.value = v;
    else
        return v;
});

演示: http://jsfiddle.net/BeSad/

【讨论】:

  • 谢谢。您的代码运行良好。对不起,最后的分号。这是一个错字,但我从这个错误中学到了很多东西。
  • @IHateLazy:我看到了一些新的东西,比如更改密钥,但我可以知道这个功能在哪里,以便我可以更详细地了解。如果我想在 for 循环中向键添加数字,我似乎无法让它像 -- this.batchi.concat(string(i)) = v;其中 i 在 for 循环中递增。
  • @IHateLazy:请参考link
  • 有谁知道为什么键名中的点不能替换,而其他字母可以吗? jsfiddle.net/dpiret/dgk5fp16/5
【解决方案2】:

试试这个:

function convert(data){
  return {
    key: data.name,
    value: data.children.map(convert);
  };
}

或者如果您需要支持没有地图的旧版浏览器:

function convert(data){
  var children = [];
  for (var i = 0, len = data.children.length; i < len; i++){
    children.push(convert(data.children[i]));
  }

  return {
    key: data.name,
    value: children
  };
}

【讨论】:

    【解决方案3】:

    你可以使用这样的函数:

    function clonerename(source) {
        if (Object.prototype.toString.call(source) === '[object Array]') {
            var clone = [];
            for (var i=0; i<source.length; i++) {
                clone[i] = goclone(source[i]);
            }
            return clone;
        } else if (typeof(source)=="object") {
            var clone = {};
            for (var prop in source) {
                if (source.hasOwnProperty(prop)) {
                    var newPropName = prop;
                    if (prop=='name') newPropName='key';
                    else if (prop=='children') newPropName='value';
                    clone[newPropName] = clonerename(source[prop]);
                }
            }
            return clone;
        } else {
            return source;
        }
    }
    
    var B = clonerename(A);
    

    请注意,您拥有的不是 JSON 数据结构(它不以 JSON is a data-exchange format 的形式存在),而可能是您从 JSON 字符串中获得的对象。

    【讨论】:

    • 我看到的唯一会取消它作为有效 JSON 标记的资格是分号 (我不知道为什么会在那里)。除此之外,为什么这不是有效的 JSON?
    • 因为 JSON 是 string 格式。这可能是一个简单的 javascript 对象,它之前只缺少一些 var a =。因此;.
    • dystroy:是的,JSON 是一种文本格式,但这并不意味着这不是服务器上文件中的一些 JSON 标记,除了那个分号。如图所示,这两种方式都确实无效。
    • ...但我想我会同意 ; 可以让我这样瘦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2016-08-19
    相关资源
    最近更新 更多