2016-07-07 20 views
0

Ich habe json formatierte Datei, 'datastores.json', die wie folgt aussieht:JSON/Python - Decodierung

{ 
"{'ESXi_Host': 'elvis.lab.vsphere.com'}": { 
    "elvis.data": { 
     "capacity": 293131517952, 
      "uuid": "57431578-630f1322-7bf2-00212883a5b0", 
      "vmfs_version": "5.60", 
      "ssd": false, 
      "extents": [ 
       "mpx.vmhba1:C0:T1:L0" 
      ], 
      "local": true 

Ich verwende den folgenden Code auf:

import json 

with open("C:\PyVmomi_out\\datastores.json") as json_file: 
datastores = json.loads(json_file.read()) 
for dstor in datastores: 
    esx_host = dstor['ESXi_Host'] 
    datastore = dstor['datastore'] 

I erhalten folgende Fehlermeldung:

TypeError: string indices must be integers 

Auf dieser Linie:

esx_host = dstor['ESXi_Host'] 

Ich verstehe, dass es eine ganze Zahl erwartet. Aus der Lektüre hatte ich mich getan, obwohl, wenn ich in

'json.loads' 

substrierten statt

'json.load' 

und auch in

'(json_file.read())' 

statt

'(json_file)' 

dann substrierten es würde die Datei als strin lesen g und erlauben String-Parsing anstelle von ganzen Zahlen. Warum hat das nicht funktioniert?

Antwort

0

Ein Problem ist, Sie müssen nicht "ESXi_Host" Schlüssel in Ihrer .json, heißt es

"{'ESXi_Host': 'elvis.lab.vsphere.com'}" 

Mitteilung "" um ihn herum, ist der Schlüssel "{'ESXi_Host': 'elvis.lab.vsphere.com'}" (dies ist eine einzelne Saite).

Zweitens geladene Objekt wird wahrscheinlich ein Wörterbuch, so Iteration Form

for dstor in datastors: 

ist über Tasten (und Schlüssel sind Strings, die nur integer Indizes), nicht Werte, den Zugriff auf Werte etwas tun, wie

for _, dstor in datastors.iteritems(): 

Ihre datastores drucken und untersuchen, was die genaue structu ist re von Ihrer geparsten .json.

+0

Ich wusste nicht, dass die einzelne Zeichenfolge ein Problem wäre. Der Fehler msg erwähnt "Ganzzahlen", verwirrend. Ich kämpfe, um herauszufinden, wie man die Formatierung repariert, damit die zwei Zeichenketten tatsächlich geteilt werden. Das Skript zum Abrufen der ESXi-Hosts/Datenspeicher im JSON-Format macht den Namen des Hosts/Datenspeichers zum Primärschlüssel. Für dynamoDB benötige ich, dass sie die Bezeichnung "ESXi_Host" und "Datenspeicher" als Primärschlüssel und die entsprechenden Namen als Schlüsselwerte haben. Dies erweist sich als schwieriger als ich dachte. Ich gehe zurück zu dem Skript, das die Daten aus vsphere holt und versuche, es zu ändern. Danke noch einmal! – tnunu

+0

Der Fehler bezüglich Ganzzahlen stammt von der falschen Iteration. Sie durchlaufen iterieren über Schlüssel, Schlüssel sind Zeichenfolgen und Zeichenfolge haben nur ganzzahlige Indizes. – lejlot