4

String として渡される JSON オブジェクトがありますが、String 形式のオブジェクトには重複したプロパティが含まれています。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ポリフィルを変更することを検討します。2つ(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 に答える