2016-05-20 2 views
0

So habe ich eine JSON-Datei, die, wenn Ba1 und alle anderen so etwas wie diesesLesen JSON-Datei und einige Werte zu modifizieren in Python in der exakt gleichen Position sein

{ 
"Version": "2.0", 
"Description": "A description...", 
"A": { 
    [...] 
}, 
"B": { 
    "B.a": { 
     "B.a.a": { 
      "Value1": "It's value", 
      "Value2": "This value" 
     }, 
     "B.a.1": { 
      "Value1": "Value x.a.1", 
      "Value2": "Value y.a.1" 
     }, 
     "B.a.2": { 
      "Value1": "Value x.a.2", 
      "Value2": "Value y.a.2" 
     }, 
     "B.a.3": { 
      "Value1": "Value x.a.3", 
      "Value2": "Value y.a.3" 
     }, 
     "B.a.4": { 
      "Value1": "Value x.a.4", 
      "Value2": "Value y.a.4" 
     }   
    } 
}, 
"C": { 
    [...] 
}, ... 

nun für den Rest meines Codeprüfung sieht sind die Werte, die sie haben sollten, und wenn nicht, wird es sie ändern.

with open(file, 'r+') as test: 
    data = json.load(test) 
    for version in allAVersions: 
     data["B"]["B.a"][version['VersionNumber']]['Value1'] = newVersion['Value1'][version['VersionNumer']]['NewValue1'] 
with open(file, 'w') as test: 
    test.write(json.dumps(data, indent=4, sort_keys=True)) 

Das funktioniert vollkommen in Ordnung! Aber das Problem ist, dass es "B" und alle Knoten darin am Anfang der Datei platziert. Wie kann ich die Datei so ändern, dass sie genau dort bleibt, wo sie bereits war? Das heißt, wenn B.a.1 - Wert 1 einen neuen Wert erhält, wird nur dieser Wert geändert und das Format ändert sich nicht.

Danke für die Hilfe :)

+0

Ich verstehe das Problem nicht. JSON ist eine Datenrepräsentation und die Reihenfolge der Elemente ist irrelevant. Zumal Sie ein Wörterbuch angeben (so wird es von Python interpretiert) und das ist ungeordnet. Was erwarten Sie bei einer ordnungsgemäßen Bestellung? Wenn es wichtig ist, sollten Sie Ihr Datenmodell überdenken. – avanwieringen

+1

Mögliche Duplikat [Kann ich JSON bekommen in eine OrderedDict in Python laden?] (Http://stackoverflow.com/questions/6921699/can-i-get-json-to-load-into-an-ordereddict-in -python) –

+0

Es ist kein Duplikat, weil ich nicht suche, es alphabetisch zu sortieren – Harbus

Antwort

1

Sie können die object_pairs_hook von json.loads|json.load verwenden, um die Elemente in eine OrderedDict zu platzieren. Dann anstelle von sort=true als Standard beibehalten. Beispiel:

from collections import OrderedDict 
import json 
text =""" { "Version": "2.0", "Description": "A description...", "A": { "B.a": { "B.a.a": { "Value1": "It's value", "Value2": "This value" }, "B.a.1": { "Value1": "Value x.a.1", "Value2": "Value y.a.1" }, "B.a.2": { "Value1": "Value x.a.2", "Value2": "Value y.a.2" }, "B.a.3": { "Value1": "Value x.a.3", "Value2": "Value y.a.3" }, "B.a.4": { "Value1": "Value x.a.4", "Value2": "Value y.a.4" } } }, "B": { "B.a": { "B.a.a": { "Value1": "It's value", "Value2": "This value" }, "B.a.1": { "Value1": "Value x.a.1", "Value2": "Value y.a.1" }, "B.a.2": { "Value1": "Value x.a.2", "Value2": "Value y.a.2" }, "B.a.3": { "Value1": "Value x.a.3", "Value2": "Value y.a.3" }, "B.a.4": { "Value1": "Value x.a.4", "Value2": "Value y.a.4" } } }, "C": { "B.a": { "B.a.a": { "Value1": "It's value", "Value2": "This value" }, "B.a.1": { "Value1": "Value x.a.1", "Value2": "Value y.a.1" }, "B.a.2": { "Value1": "Value x.a.2", "Value2": "Value y.a.2" }, "B.a.3": { "Value1": "Value x.a.3", "Value2": "Value y.a.3" }, "B.a.4": { "Value1": "Value x.a.4", "Value2": "Value y.a.4" } } }}""" 
json_object = json.loads(text, object_pairs_hook=OrderedDict) 
# Change values 
json.dumps(json_object, indent=4) 
0

Sie können nicht.

Wenn Sie JSON lesen, lesen Sie es als Diktat - die Information über die ursprüngliche Reihenfolge ist verloren.

Was Sie tun können (aber es kann sogar erfordern, schreiben Sie Ihren eigenen JSON-Writer - ich weiß keine andere Lösung im Moment) ist JSON in einigen kanonischen Form schreiben (z. B. mit Schlüsseln bestellt lexikografischen Reihenfolge). Wenn die Quelldatei ein kanonischer JSON ist, speichern Sie sie so, wie sie war.

Verwandte Themen