2017-06-05 3 views
0

Ich bin neu in Python und habe in ein Problem, dass ich nicht in der Lage zu lösen trotz viel suchen und lesen verwandte Beiträge laufen. Jede Hilfe ist sehr geschätzt: Ich habe eine JSON-Datei in ein Verzeichnis importiert, die diese Struktur hat:Python Ausgabe dict zu neuen JSON-Struktur

{ 
"23991": { 
"5115": 10, 
"2611": 22 
}, 
"43223": { 
"7252": 11, 
"4302": 2 
} 
} 

Ich will es auf eine neue JSON-Datei speichern, mit dieser Struktur:

[ 
{ 
    "sni": { 
    "code": "23991", 
    "yrken": [ 
    { 
     "code": "5115", 
     "antal": 10 
    }, 
    { 
     "code": "2611", 
     "antal": 22 
    } 
    ] 
    } 
}, 
{ 
    "sni": { 
    "code": "43223", 
    "yrken": [ 
    { 
     "code": "7252", 
     "antal": 11 
    }, 
    { 
     "code": "4302", 
     "antal": 11 
    } 
    ] 
    } 
} 
] 

So bis jetzt habe ich diesen Code:

import os 
import sys 
import json 

pathSNI2Yrke = "Smallsni2Yrke.json" 
with open(pathSNI2Yrke) as data_file: 
sni2Yrke = json.load(data_file) 
#print(sni2Yrke) 

for key in sni2Yrke: 
    value = sni2Yrke[key] 
    d = [{"sni": 
      {"snicode": key, 
      "yrken": [{ "yrkecode":list(value.keys()), 
         "antal": list(value.values())}]}}] 
    j = json.dumps(d, indent=2) 
    #f = open('sample.json', 'w') 
    print (j) 

Was mir dieses Ergebnis gibt:

[ 
{ 
    "sni": { 
    "snicode": "23991", 
    "yrken": [ 
    { 
     "yrkecode": [ 
     "5115", 
     "2611" 
     ], 
     "antal": [ 
     10, 
     22 
     ] 
    } 
    ] 
    } 
} 
] 
[ 
{ 
    "sni": { 
    "snicode": "43223", 
    "yrken": [ 
    { 
     "yrkecode": [ 
     "7252", 
     "4302" 
     ], 
     "antal": [ 
     11, 
     2 
     ] 
    } 
    ] 
    } 
    } 
] 

Wie Sie sehen, ist dies nicht eine korrekte JSON-Struktur, und für das Leben von mir kann ich nicht herausfinden, wie man die Struktur richtig macht. Die Ausgabe geht den ganzen Weg zurück zum Wurzelelement, also bekomme ich ...] [... statt ...}, {.... zwischen den "Sni" Blöcken Wenn Sie Tipps haben, wie der Code könnte sei besser oder ein besserer Weg, um das Ergebnis zu erreichen, lass es mich bitte haben.

+0

Sparen Sie es als eine Liste. Was erwartest du? – user3764893

Antwort

1

einige verschachtelte comprehensions verwenden, können Sie folgendes tun:

> d = {'43223': {'4302': 2, '7252': 11}, '23991': {'5115': 10, '2611': 22}} 

> d2 = [ 
    {'sni': 
    {'code': k1, 
    'yrken': [{'code': k2, 'antal': v2} for k2, v2 in v1.items()] 
    } 
    } 
    for k1, v1 in d.items() 
] 

> print json.dumps(d2, indent=1) 
[ 
{ 
    "sni": { 
    "code": "43223", 
    "yrken": [ 
    { 
    "antal": 2, 
    "code": "4302" 
    }, 
    { 
    "antal": 11, 
    "code": "7252" 
    } 
    ] 
    } 
}, 
{ 
    "sni": { 
    "code": "23991", 
    "yrken": [ 
    { 
    "antal": 10, 
    "code": "5115" 
    }, 
    { 
    "antal": 22, 
    "code": "2611" 
    } 
    ] 
    } 
} 
] 
+0

Das hat für mich funktioniert! Ich habe gerade das d = in meinem Code durch d2 = ersetzt und benutze 'für k1, v1 in sni2Yrke.items()' anstelle von 'd.items()' Sehr geschätzt. – bruceoz

1

Enjoy:

result = [] 

for code, dct in your_json.items(): 
    yrken = [] 
    for c, antal in dct.items(): 
     yrken.append({ 
      "code": c, 
      "antal": antal 
     }) 
    result.append({ 
     "sni": { 
      "code": code, 
      "yrken": yrken 
     } 
    }) 

print(result) 
+0

@Formalhaut Das hat auch sehr gut funktioniert. Ich werde das auseinander nehmen, damit ich es besser verstehe. :) – bruceoz