在嵌套的JSON结构中更改键名

7

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

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

我需要将“name”和“children”的键名更改为“key”和“value”。有没有建议可以在此嵌套结构中为每个键名进行更改?


你想在什么时候/地方进行更改? - I Hate Lazy
你为什么在结尾加了一个分号?你在问题中到底代表了什么? - I Hate Lazy
3个回答

17

我不知道为什么你在 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/


1
谢谢。你的代码完美运行了。对于末尾的分号我很抱歉,那是个打字错误,但我从这个错误中学到了很多。 - user1842231
@IHateLazy:我看到了一些新的东西,比如改变键名,但是我想知道这个函数在哪里,这样我就可以更详细地了解它。如果我想在for循环中将数字添加到键名中,似乎我无法像这样使其工作-- this.batchi.concat(string(i)) = v; 其中i在for循环中递增。 - user1739825
1
@IHateLazy:请参考链接 - user1739825
有人知道为什么不能在键名中替换点,但可以替换其他字母吗?https://jsfiddle.net/dpiret/dgk5fp16/5/ - daniel p
@danielp 为什么你使用了 k.search?那个函数是用来处理正则表达式的(所以给它传入 '.' 会导致意外的结果)。你可能想要使用 k.indexOf('.')。 - targumon

0
你可以使用像这样的函数:
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 是一种数据交换格式),而可能是从 JSON 字符串中获取的对象。

我唯一看到的可能使其无效的 JSON 标记是分号(我不知道为什么会有分号)。除此之外,为什么这不是有效的 JSON 呢? - I Hate Lazy
因为JSON是一个字符串格式。这可能是一个简单的JavaScript对象,只是缺少一些var a =之前的东西。因此需要加上; - Denys Séguret
dystroy:是的,JSON是一种文本格式,但这并不意味着除了那个分号之外,在服务器上有一个JSON标记。无论如何,它都不是有效的,就像所示的那样。 - I Hate Lazy
...但我想我同意;可能会让我倾向于那个方向。 - I Hate Lazy

0

试试这个:

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

或者如果您需要支持不支持 map 的旧浏览器:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接