2012-04-14 8 views
1

Ich habe eine Liste namens filelist = [] , an die ich ein Wörterbuch von einigen Schlüssel-Wert-Paare anhängen.inneres Wörterbuch Parsing eines JSON-Objekts in Python

filelist.append({"url": url, "exename": ename, "filename": fname}] as I loop through a set of files. 
Later, loads() the below json object to a "json" key: 

for file in filelist: file["json"] = json.loads(json) 

Ich habe keine Schwierigkeiten beim Herausziehen der ersten Schicht von Wörterbuchwerten, dh.

for files in filelist: 
    print files["json"]["response_code"] 

>>> 1 

Allerdings habe ich Probleme habe, um das innere Wörterbuch auf immer gebunden zu Dateien [ "json"] [ "Scans"] zum Beispiel gehe ich davon aus:

for files in filelist: 
    for avvendors in files["json"]["scans"] 

I bin wirklich daran interessiert, den "entdeckten" Schlüssel herauszuziehen, aber es scheint, dass Python den Schlüssel "scans" nicht als Wörterbuch lädt, sondern stattdessen als String speichert. Ich denke daran, eine zweite Ladung() auf dem inneren Wörterbuch zu tun, um zu sehen, was passiert.

for stuff in avvendors: 
    if stuf["detected"]: 
     #do something 

Ich bin nicht wirklich sicher, was hier passiert. Ich weiß, dass ich es wahrscheinlich herausfinden werde, aber einige Einblicke darin, was Python mit dem Json intern tun würde, wären nett. Außerdem werde ich bis Montag oder Dienstag, vielleicht sogar Mittwoch, keine Gelegenheit haben, daran zu arbeiten, und die Spannung bringt mich um.

Hier ist der vollständige Block zur besseren Lesbarkeit:

für Dateien in Dateiliste: für avvendors in Dateien [ "json"] [ "Scans]: wenn avvendors [" erkannt "]: #Do etwas Nützliches

{"response_code": 1, 
"verbose_msg": "Scan finished, scan information embedded in this object", 

"resource": "99017f6eebbac24f351415dd410d522d", 
"scan_id": "52d3df0ed60c46f336c131bf2ca454f73bafdc4b04dfa2aea80746f5ba9e6d1c-1273894724", 
"md5": "99017f6eebbac24f351415dd410d522d", 
"sha1": "4d1740485713a2ab3a4f5822a01f645fe8387f92", 
"sha256": "52d3df0ed60c46f336c131bf2ca454f73bafdc4b04dfa2aea80746f5ba9e6d1c", 

"scan_date": "2010-05-15 03:38:44", 

"positives": 40, 
"total": 40, 
"scans": {"nProtect": {"detected": true, "version": "2010-05-14.01", "result": "Trojan.Generic.3611249", "update": "20100514"}, 
"CAT-QuickHeal": {"detected": true, "version": "10.00", "result": "Trojan.VB.acgy", "update": "20100514"}, 
"McAfee": {"detected": true, "version": "5.400.0.1158", "result": "Generic.dx!rkx", "update": "20100515"}, 
"TheHacker": {"detected": true, "version": "6.5.2.0.280", "result": "Trojan/VB.gen", "update": "20100514"}, 
"VirusBuster": {"detected": true, "version": "5.0.27.0", "result": "Trojan.VB.JFDE", "update": "20100514"}, 
"NOD32": {"detected": true, "version": "5115", "result": "a variant of Win32/Qhost.NTY", "update": "20100514"}, 
"F-Prot": {"detected": false, "version": "4.5.1.85", "result": null, "update": "20100514"}, 
"Symantec": {"detected": true, "version": "20101.1.0.89", "result": "Trojan.KillAV", "update": "20100515"}, 
"Norman": {"detected": true, "version": "6.04.12", "result": "W32/Smalltroj.YFHZ", "update": "20100514"}, 
"TrendMicro-HouseCall": {"detected": true, "version": "9.120.0.1004", "result": "TROJ_VB.JVJ", "update": "20100515"}, 
"Avast": {"detected": true, "version": "4.8.1351.0", "result": "Win32:Malware-gen", "update": "20100514"}, 
"eSafe": {"detected": true, "version": "7.0.17.0", "result": "Win32.TRVB.Acgy", "update": "20100513"}, 
"ClamAV": {"detected": false, "version": "0.96.0.3-git", "result": null, "update": "20100514"}, 
"Kaspersky": {"detected": true, "version": "7.0.0.125", "result": "Trojan.Win32.VB.acgy", "update": "20100515"}, 
"BitDefender": {"detected": true, "version": "7.2", "result": "Trojan.Generic.3611249", "update": "20100515"}, 
"Comodo": {"detected": true, "version": "4842", "result": "Heur.Suspicious", "update": "20100515"}, 
"F-Secure": {"detected": true, "version": "9.0.15370.0", "result": "Trojan.Generic.3611249", "update": "20100514"}, 
"DrWeb": {"detected": true, "version": "5.0.2.03300", "result": "Trojan.Hosts.37", "update": "20100515"}, 
"AntiVir": {"detected": true, "version": "8.2.1.242", "result": "TR/VB.acgy.1", "update": "20100514"}, 
"TrendMicro": {"detected": true, "version": "9.120.0.1004", "result": "TROJ_VB.JVJ", "update": "20100514"}, 
"McAfee-GW-Edition": {"detected": true, "version": "2010.1", "result": "Generic.dx!rkx", "update": "20100515"}, 
"Sophos": {"detected": true, "version": "4.53.0", "result": "Troj/VBHost-A", "update": "20100515"}, 
"eTrust-Vet": {"detected": true, "version": "35.2.7490", "result": "Win32/ASuspect.HDBBD", "update": "20100515"}, 
"Authentium": {"detected": false, "version": "5.2.0.5", "result": null, "update": "20100514"}, 
"Jiangmin": {"detected": true, "version": "13.0.900", "result": "Trojan/VB.yqh", "update": "20100514"}, [...] } 

Antwort

2

Seien Sie vorsichtig, wenn über einen dict Iterieren Es die Schlüssel nur zurück, wenn Sie die Schlüssel und Werte wollen, die .iteritems() Methode verwenden (oder in Python3, .items()):..

for files in filelist: 
    for avvendor, stuf in files["json"]["scans"].iteritems(): 
     if stuf["detected"]: 
      #do something 

In Ihrem Fall wird der Wert des scans Schlüssel ist ein dict: "scans": {"nProtect": ...}

+0

Denken Sie daran, als in Python 3.x ist dies nur '' dict.items() ''. –

+0

Also Python lädt wahrscheinlich das innere Wörterbuch als ein Wörterbuch, und ich bin falsch in der Annahme, dass es nur als String geladen wurde? – Dale

+0

'json.loads()' gibt ein Python-Objekt zurück, z. B. eine Liste mit Dicts von Dicts. Also ja, das innere Wörterbuch ist ein Diktat, keine Zeichenfolge. – unutbu