2017-12-05 2 views
0

Rekursion Wörterbuch von JSON abflachen, indem Sie habe ich folgende .json Datei:Nested und

{ 
    "level1_one":"1", 
    "level1_two":{ 
     "level2_one":"2", 
     "level2_two":{ 
      "level3_one":"bottom" 
     } 
    } 
} 

Ich brauche Darstellung verschachtelt zu geben und flach wie so:

{ 
    "level1_two": { 
     "level2_two": { 
      "level3_one": "bottom" 
     }, 
     "level2_one": "2" 
    }, 
    "level1_one": "1" 
} 

und

{ 
    "level2_one": "2", 
    "level3_one": "bottom", 
    "level1_one": "1" 
} 

Ich weiß, ich kann leicht die verschachtelte Form erreichen, indem Sie einfach dies tun:

def json_parser(filename): 
    data = json.load(open(filename)) 
    print(data) 

Das Problem ist, dass es getan werden muss, indem Rekursion für beide Fälle verwendet. Ich habe fast alles ausprobiert, was ich hier finden konnte, aber ohne viel Erfolg. Wie kann ich das machen?

+1

Was haben Sie versucht? Und warum müssen Sie es mit Rekursion tun? – user1767754

+0

Fast alles, was ich durch Rekursion finden konnte. Das Problem ist, sobald ich auf den Grund des JSON komme, kann ich keinen Weg finden, es zurück zu vertreten. Es muss so gemacht werden, da es eine Art Herausforderung ist. Ich habe etwas Erfahrung mit JSON, aber das kommt ein bisschen verdrahtet. – sretko

+0

Also sagst du, dass es nicht wirklich rekursiv ist? – martineau

Antwort

1

Sie können dies versuchen:

s = { 
"level1_one":"1", 
"level1_two":{ 
    "level2_one":"2", 
    "level2_two":{ 
     "level3_one":"bottom" 
    } 
    } 
} 
def flatten(s): 
    for i in s: 
     if not isinstance(s[i], dict): 
      yield (i, s[i]) 
     else: 
      for b in flatten(s[i]): 
       yield b 

new_data = dict(list(flatten(s))) 

Ausgang:

{'level2_one': '2', 'level3_one': 'bottom', 'level1_one': '1'} 
+0

Großartig. Wie erwartet. Kannst du etwas für die verschachtelte Version vorschlagen? – sretko

+0

@sretko froh zu helfen! In Bezug auf die verschachtelte Version habe ich keinen Unterschied zwischen Ihrer gewünschten verschachtelten Version und der ursprünglichen Datenstruktur gesehen? Könnten Sie das klären? – Ajax1234

+0

Es ist gerade bearbeitet. Schau es dir nochmal an und du wirst es deutlich sehen. – sretko

0

So etwas wie dieses

def flatten_dict(d): 
    def items(): 
     for key, value in d.items(): 
      if isinstance(value, dict): 
       for subkey, subvalue in flatten_dict(value).items(): 
        yield subkey, subvalue 
      else: 
       yield key, value 

    return dict(items()) 

diese zurück

{'level1_one': '1', 'level2_one': '2', 'level3_one': 'bottom'} 

für das Beispiel, das Sie

geschrieben