2012-11-22 14 views
5

ich eine JSON-Datenstruktur haben, wie unten dargestellt:Schlüsselnamen in verschachtelte JSON Struktur

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

Ich brauche die Schlüsselnamen von „name“ & „Kinder“ zu ändern, zu sagen, „Schlüssel“ & „Wert ". Irgendwelche Vorschläge, wie Sie das für jeden Schlüsselnamen in dieser verschachtelten Struktur tun können?

+0

Wann/Wo sehen Sie die Änderung vornehmen möchten? –

+0

... und warum haben Sie am Ende ein Semikolon? Was genau repräsentierst du in der Frage? –

Antwort

11

Ich weiß nicht, warum Sie ein Semikolon am Ende Ihrer JSON Markup haben (vorausgesetzt, das ist, was Sie in der Frage dargestellt haben), aber wenn das entfernt wird, können Sie eine Reviver-Funktion verwenden, um Änderungen vorzunehmen, während die Daten analysiert werden.

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

DEMO:http://jsfiddle.net/BeSad/

+1

danke. Ihr Code funktioniert perfekt. Sorry für Semikolon am Ende. Es war ein Tippfehler, aber ich habe so viel von diesem Fehler gelernt. – user1842231

+0

@ user1842231: Gern geschehen. –

+0

@IHateLazy: Ich sehe etwas Neues wie das Ändern des Schlüssels, aber ich kann wissen, wo diese Funktion ist, damit ich mehr Details erfahren kann. Und wenn ich dem Schlüssel in der for-Schleife eine Zahl hinzufügen möchte, scheine ich es nicht funktionieren zu lassen - this.batchi.concat (string (i)) = v; wo ich in der for-Schleife inkrementiert. – user1739825

0

Sie könnten eine Funktion wie folgt verwendet werden:

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

Beachten Sie, dass Sie, was haben, ist nicht eine JSON-Datenstruktur (diese existiert nicht als JSON is a data-exchange format), aber wahrscheinlich ein Objekt, das Sie von einem JSON-String bekamen .

+0

Das einzige, was ich sehe, würde es als gültiges JSON-Markup disqualifizieren ist das Semikolon * (ich habe keine Ahnung, warum das dort ist) *. Abgesehen davon, warum wäre das nicht JSON? –

+0

Da JSON ein * string * -Format ist. Dies ist wahrscheinlich ein einfaches JavaScript-Objekt, es fehlen nur einige 'var a =' vorher. daher das ';'. –

+0

dystroy: Ja, JSON ist ein Textformat, aber das bedeutet nicht, dass es sich nicht um ein JSON-Markup in einer Datei auf dem Server handelt, wieder mit Ausnahme des Semikolons. Es ist wirklich nicht gültig, wie gezeigt. –

0

Try this:

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

Oder wenn Sie ohne Karte älteren Browser unterstützen müssen:

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