2017-07-26 1 views
0

Ich muss den Wert für Schlüssel (id) in der JSON-Datei aktualisieren. Der Wert wird in der Variablen ids gespeichert. Ich bin in der Lage, den Schlüssel id mit ids (aktualisierten Wert) zu aktualisieren, aber die Struktur der JSON-Datei wird durcheinander gebracht. Kann jemand mir einen Weg vorschlagen, ohne die JSON-Struktur durcheinander zu bringen?JSON-Wert für einen bestimmten Schlüssel aktualisieren, JSON-Struktur beibehalten

Code:

ids=10 
filename='update_test.json' 
with open(filename,'r') as f: 
    data=json.load(f) 
    data['id'] = ids 
os.remove(filename) 
with open(filename,'w') as f: 
    json.dump(data,f,indent=4) 

Eingang JSON:

{ 
    "accountableExecutiveTech": "string", 
    "api": true, 
    "arrivalFrequency": "string", 
    "bucketName": "string", 
    "businessDataset": "string", 
    "columns": [{ 
     "businessColumnName": "string", 
     "childColumns": [{}], 
     "columnOrder": 0, 
     "description": "string", 
     "descriptiveName": "string", 
     "format": "string", 
     "hierarchicalName": "string", 
     "id": 0, 
     "isArray": true, 
     "length": 0, 
     "name": "string", 
     "parentColumnName": "string", 
     "partitionColumn": true, 
     "technicalDatasetId": 0, 
     "technicalDatasetName": "string", 
     "technicalNamespace": "string", 
     "technicalPlatformName": "string", 
     "type": "string", 
     "validValues": {} 
    }], 
    "controlMJobName": "string", 
    "credit": true, 
    "delimiter": "string", 
    "delimiterFlag": true, 
    "description": "string", 
    "dqPrioritized": true, 
    "fileFormat": "string", 
    "id": "", 
    "name": "string", 
    "namespace": "string", 
    "npi": true, 
    "objectKey": "string", 
    "pci": true, 
    "performingDataSteward": "string", 
    "platformName": "string", 
    "retentionPlan": "string", 
    "selectAdGroup": "string", 
    "sourceDatasets": [{ 
     "id": 4534, 
     "name": "string", 
     "namespace": "string", 
     "platformName": "string" 
    }], 
    "tags": ["string"] 
} 

Ausgang JSON:

{ 
    "accountableExecutiveTech": "string", 
    "delimiterFlag": true, 
    "performingDataSteward": "string", 
    "api": true, 
    "dqPrioritized": true, 
    "id": 14044, 
    "namespace": "string", 
    "fileFormat": "string", 
    "selectAdGroup": "string", 
    "pci": true, 
    "platformName": "string", 
    "columns": [ 
     { 
      "isArray": true, 
      "partitionColumn": true, 
      "description": "string", 
      "technicalDatasetId": 0, 
      "format": "string", 
      "technicalPlatformName": "string", 
      "parentColumnName": "string", 
      "columnOrder": 0, 
      "length": 0, 
      "childColumns": [ 
       {} 
      ], 
      "descriptiveName": "string", 
      "validValues": {}, 
      "technicalDatasetName": "string", 
      "technicalNamespace": "string", 
      "hierarchicalName": "string", 
      "businessColumnName": "string", 
      "type": "string", 
      "id": 0, 
      "name": "string" 
     } 
    ], 
    "businessDataset": "string", 
    "npi": true, 
    "description": "string", 
    "tags": [ 
     "string" 
    ], 
    "arrivalFrequency": "string", 
    "objectKey": "string", 
    "bucketName": "string", 
    "controlMJobName": "string", 
    "name": "string", 
    "retentionPlan": "string", 
    "credit": true, 
    "delimiter": "string", 
    "sourceDatasets": [ 
     { 
      "platformName": "string", 
      "namespace": "string", 
      "id": 4534, 
      "name": "string" 
     } 
    ] 
+0

was wird "versaut"? Fügen Sie die Ausgabe JSON auch – shikhanshu

Antwort

0

Wenn du gehst, diese dann vielleicht Kasse Pinch viel zu tun. https://github.com/Baggz/Pinch

var data = { 
    user: { 
    id: '123' 
    }, 
    request: { 
    id: '456' 
    }, 
    book: { 
    id: '789' 
    } 
}; 

// Converts all ids to a number 
pinch(data, /id/, function(path, key, value) { 
    return parseInt(value); 
}); 

Sieht so einfach.

1

Ich vermute, Sie beziehen sich auf die Reihenfolge der Schlüssel in Ihrem Wörterbuch (später in serialisierten JSON), die geändert wird. Das liegt daran, dass json.load() standardmäßig dict als unterzeichnenden Zuordnungstyp verwendet.

Aber man kann das zu einem Wörterbuchtyp ändern, die Reihenfolge bewahrt, genannt collections.OrderedDict:

from collections import OrderedDict 

ids = 10 
filename = 'update_test.json' 

with open(filename, 'r') as f: 
    data = json.load(f, object_pairs_hook=OrderedDict) 
    data['id'] = ids 

with open(filename, 'w') as f: 
    json.dump(data, f, indent=4) 

Beachten Sie die Verwendung von object_pairs_hook=OrderedDict in json.load(). Aus der Dokumentation:

object_pairs_hook ist eine optionale Funktion, die mit dem Ergebnis eines beliebigen Objektliterals mit einer geordneten Liste von Paaren dekodiert wird. Der Rückgabewert von object_pairs_hook wird anstelle von dict verwendet. Diese Funktion kann zum Implementieren benutzerdefinierter Decoder verwendet werden, die auf der Reihenfolge basieren, in der die Schlüssel- und Wertepaare dekodiert werden (z. B. collections.OrderedDict() erinnert sich an die Reihenfolge der Einfügung).

+0

Wahrscheinlich sicherer, um die Datei mit einem temporären Namen zu verschieben oder umzubenennen, bevor das Original weggeblasen wird. Was passiert, wenn beim Schreiben etwas passiert? –

+0

Sie haben Recht, ich habe nur den Code von OP. Ich habe den Anruf zum 'Entfernen' entfernt. – randomir

+0

Versucht mit orderedDict gibt es mir immer noch das gleiche Ergebnis. – Shrikant

Verwandte Themen