4

我有一个 JSON 对象作为字符串传递给我,但其字符串形式的对象包含重复的属性。我需要临时向属性添加递增数字以避免重复 JSON 属性的问题。完成对象的编辑后,我会将对象 JSON.Stringify 回字符串并删除数字。

这是我传递的字符串:

{
    "View":{
        "Image":{
            "BackgroundImage":"Image.png",
             "Position":[0,0],
             "Width":320,
             "Height":480
        },
        "Button":{
            "BackgroundImage":"ButtonTop.png",
             "Position":[61,83],
             "Width":217,
             "Height":58
        },
        "Button":{
            "BackgroundImage":"ButtonBottom.png",
             "Position":[61,214],
             "Width":205,
             "Height":73
        },
        "TextField":{
            "BackgroundImage":"TextFieldLogin.png",
             "Position":[102,336],
             "Width":189,
             "Height":31
        },
        "Label":{
            "Position":[137,100],
             "Width":72,
             "Height":20,
             "Text":"Hi Steve",
             "FontSize":18,
             "Color":[0,0,0,1]
        },
        "Label":{
            "Position":[43,342],
             "Width":54,
             "Height":20,
             "Text":"Login:",
             "FontSize":18,
             "Color":[0,0,0,1]
        },
        "Label":{
            "Position":[115,234],
             "Width":54,
             "Height":20,
             "Text":"Button",
             "FontSize":18,
             "Color":[0,0,0,1]
        }
    }
}

这是我希望输出的方式:

{
    "View_1":{
        "Image_1":{
            "BackgroundImage":"Image.png",
             "Position":[0,0],
             "Width":320,
             "Height":480
        },
        "Button_1":{
            "BackgroundImage":"ButtonTop.png",
             "Position":[61,83],
             "Width":217,
             "Height":58
        },
        "Button_2":{
            "BackgroundImage":"ButtonBottom.png",
             "Position":[61,214],
             "Width":205,
             "Height":73
        },
        "TextField_1":{
            "BackgroundImage":"TextFieldLogin.png",
             "Position":[102,336],
             "Width":189,
             "Height":31
        },
        "Label_1":{
            "Position":[137,100],
             "Width":72,
             "Height":20,
             "Text":"Hi Steve",
             "FontSize":18,
             "Color":[0,0,0,1]
        },
        "Label_2":{
            "Position":[43,342],
             "Width":54,
             "Height":20,
             "Text":"Login:",
             "FontSize":18,
             "Color":[0,0,0,1]
        },
        "Label_3":{
            "Position":[115,234],
             "Width":54,
             "Height":20,
             "Text":"Button",
             "FontSize":18,
             "Color":[0,0,0,1]
        }
    }
}

如何使用 javascript .replace() 按需添加编号,然后按需删除编号?

4

2 回答 2

2

这个怎么样?我同意这里的其他声音,建议提供此“JSON”的人负责提供有效的语法,但除非有这种可能性,否则这可能会让您入门:

function formatJSON(input) {
  return input.replace(/"([^"]+?)":{(.+)}/g, function(string, key, value) {
    var dict = {};
    return '"' + key + '":{' + value.replace(/"([^"]+?)":{(.+?)}/g, function(string, key, value) {
      dict[key] = dict[key] == undefined ? 1 : ++dict[key];
      return '"' + key + '_' + dict[key] + '":{' + formatJSON(value) + '}';
    }) + '}';
  });
};

JSFiddle:http: //jsfiddle.net/WYkAT/

请注意,这将无法重命名更复杂、更深的 JSON 字符串上的所有键。它可以很容易地修改为更具递归性并且对您的特定情况不太具体,但可能会导致一些性能下降。如果您需要一个成熟的解决方案,我会考虑修改现有的 JSON.parse polyfill。这里有两个(JSON2 和 JSON3):

  1. https://github.com/douglascrockford/JSON-js
  2. https://github.com/bestiejs/json3
于 2013-01-13T02:05:40.117 回答
1
于 2013-01-13T01:38:33.860 回答