2016-04-07 6 views
1

Ich möchte alle Vorkommen eines bestimmten JSON-Objekts in einer JSON-Datei mit einem der Schlüssel finden, die es hat. Zum Beispiel, wenn ich habe folgenden json Block:Wie wird nach allen Vorkommen eines Schlüssels in einer tief verschachtelten JSON-Datei gesucht?

{ 
        "FNMIP": 1, 
        "FNMIT": 0, 
        "FNMP": { 
        "DP": { 
         "DT": 0, 
         "UF": true, 
         "DF": "yyyyMMdd" 
        }, 
        "FP": { 
         "FE": null 
        } 
        }, 
        "IE": true, 
        "$": "PMF" 
       } 

ich für die ganzen json Block zu suchen, die diesen Schlüssel enthalten und dann eine Art eine Logik anwenden es mit einem anderen JSON-Objekt zu ersetzen. Ich bin nicht in der Lage, herauszufinden, wie man das in Python macht, da ich neu in Python bin.

+0

So möchten Sie eine DFS-Suche zu tun, und wenn Sie eine Übereinstimmung finden, fügen Sie das Objekt zu einem Array? Sie müssen nur rekursiv gehen es – Fallenreaper

+0

Ich bekomme die Idee, Tiefe zuerst Suche zu tun, was ich tun möchte, ist ein DFS tun und wenn ich das Objekt finde, ersetze es mit einem neuen Objekt und meine Suche weiter suchen nach mehr Objekte dieser Typ. – AnkitSablok

+0

könnten Sie ein Beispiel für Daten und Änderungen bereitstellen? Vielleicht möchten Sie in [die Dokumentation zum 'dict'-Objekttyp] (https://docs.python.org/2/library/stdtypes.html#mapping-types-dict) schauen –

Antwort

1

Wenn ich richtig verstehe, möchten Sie verschachtelt dict s gehen und für jeden Wert, der einem bestimmten Wert entspricht, ersetzen Sie es durch etwas anderes. also dies tun:

def recursive_replace(data,match,repl): 
    for k,v in data.items(): 
     if v == match: 
      data[k] = repl #replace the matched value 
     elif isinstance(v,dict): 
      recursive_replace(v,match,repl) 

dann können Sie nur die Daten zurück in JSON konvertieren.

stattdessen zu testen, ob "$" Schlüssel in den Daten vorhanden sind, Sie den in Operator verwenden:

def recursive_replace(data,repl): 
    for k,v in data.items(): 
     if not isinstance(v,dict): 
      continue 
     elif "$" in v: 
      data[k] = repl 
     else: 
      recursive_replace(v,repl) 
+0

so ist die Sache, wenn ich sehe das für JSON-Objekt wie das obige, wenn "$": "PMF" dann ersetzen Sie es mit einem neuen Objekt insgesamt. – AnkitSablok

+0

_replace es mit einem neuen object_ wie was? Ist es ein statischer Wert oder wird bestimmt, wo sich die Daten im übergeordneten Schema befinden? Willst du Daten wie '{" tadhg ": {" $ ":" A "}," Ankit ": {" $ ":" B "}}' um den "$" Schlüssel mit dem Schlüssel ab einer Ebene zu ersetzen in der Struktur? Damit sind die neuen Daten wie '{" tadhg ": {" tadhg ":" A "}," Ankit ": {" Ankit ":" B "}}' –

+0

Nein, also wenn ich etwas mit "$" finde : "A", dann möchte ich das übergeordnete Objekt ersetzen, das ein Wörterbuch sein kann, in dem "$" ein Schlüssel mit einem neuen Wörterbuch ist, also wenn die Struktur wie {"X": "S", "V": {"$ ": PFM}}, dann ersetzen Sie es zum Beispiel mit {" P ":" A "}. – AnkitSablok

Verwandte Themen