2016-06-24 10 views
0

Ich versuche, einige JSON zu analysieren, die ich von einer RESTful-API empfange, aber ich habe Probleme beim Zugriff auf die Daten in Python, da anscheinend ein leerer Eigenschaftsname vorhanden ist.So analysieren Sie leere JSON-Eigenschaft/Element in Python

Eine Probe des JSON zurückgegeben:

{ 
    "extractorData" : { 
"url" : "RetreivedDataURL", 
"resourceId" : "e38e1a7dd8f23dffbc77baf2d14ee500", 
"data" : [ { 
    "group" : [ { 
    "CaseNumber" : [ { 
     "text" : "PO-1994-1350", 
     "href" : "http://www.referenceURL.net" 
    } ], 
    "DateFiled" : [ { 
     "text" : "03/11/1994" 
    } ], 
    "CaseDescription" : [ { 
     "text" : "Mary v. JONES" 
    } ], 
    "FoundParty" : [ { 
     "text" : "Lastname, MARY BETH (Plaintiff)" 
    } ] 
    }, { 
    "CaseNumber" : [ { 
     "text" : "NP-1998-2194", 
     "href" : "http://www.referenceURL.net" 
    }, { 
     "text" : "FD-1998-2310", 
     "href" : "http://www.referenceURL.net" 
    } ], 
    "DateFiled" : [ { 
     "text" : "08/13/1993" 
    }, { 
     "text" : "06/02/1998" 
    } ], 
    "CaseDescription" : [ { 
     "text" : "IN RE: NOTARY PUBLIC VS REDACTED" 
    }, { 
     "text" : "REDACTED" 
    } ], 
    "FoundParty" : [ { 
     "text" : "Lastname, MARY H (Plaintiff)" 
    }, { 
     "text" : "Lastname, MARY BETH (Defendant)" 
    } ] 
    } ] 
} ] 

Und der Python-Code I

import requests 
import json 

FirstName = raw_input("Please Enter First name: ") 
LastName = raw_input("Please Enter Last Name: ") 


with requests.Session() as c: 
url = ('https://www.requestURL.net/?name={}&lastname={}').format(LastName, FirstName) 
page = c.get(url) 
data = page.content 

theJSON = json.loads(data) 

def myprint(d): 
stack = d.items() 
while stack: 
    k, v = stack.pop() 
    if isinstance(v, dict): 
     stack.extend(v.iteritems()) 
    else: 
     print("%s: %s" % (k, v)) 

print myprint(theJSON["extractorData"]["data"]["group"]) 

Ich erhalte den Fehler zu verwenden bin versucht:

TypeError: list indices must be integers, not str 

Ich bin neu in Parsing Python und mehr als einfache Python im Allgemeinen so entschuldigen Sie meine Ignoranz. Aber was führt mich zu glauben, dass es eine leere Eigenschaft ist, dass, wenn ich ein Tool verwenden, um die JSON visuell online zu sehen, ich leere Klammern bekommen, wie so:

printscreen http://image.prntscr.com/image/6f8a8e4a1b8742d081bff024207d6426.png

Jede Hilfe dieser Daten in Text-Parsing wäre eine große Hilfe.

EDIT: Jetzt bin ich in der Lage einen bestimmten Knoten mit diesem Code zu verweisen:

for d in group: 
print group[0]['CaseNumber'][0]["text"] 

Aber jetzt, wie kann ich iterieren über alle in der Gruppe Eigenschaft aufgeführt Wörterbücher alle Knoten zur Liste der Aufschrift „CaseNumber“ weil es in jedem von ihnen existieren sollte. z.B

print group[0]['CaseNumber'][0]["text"] 

dann

for d in group: 
print group[1]['CaseNumber'][0]["text"] 

und so weiter und so fort. Vielleicht eine ganze Zahl inkrementieren, bis sie das Ende erreicht? Ich bin mir nicht ganz sicher.

Antwort

1

Wenn Sie Json sorgfältig betrachten, ist der Schlüssel data, auf den Sie zugreifen, tatsächlich eine Liste, aber data['group'] versucht, darauf zuzugreifen, als ob es ein Wörterbuch wäre, das den TypeError anhebt.

minify Ihre json ist es so etwas wie dieses

{ 
    "extractorData": { 
     "url": "string", 
     "resourceId": "string", 
     "data": [{ 
      "group": [] 
     }] 
    } 
} 

Also, wenn Sie Gruppe zugreifen möchten, sollten Sie zunächst data abrufen, die eine Liste ist.

data = sample['extractorData']['data'] 

dann können Sie über data iterieren und group in ihm

for d in data: 
    group = d['group'] 

Ich hoffe, das klärt die Dinge ein wenig für Sie.

+0

Das hilft ein bisschen. Ich war in der Lage, den Inhalt von "Gruppe" zu retreißen. Ich glaube, Sie wollten ein schließendes Zitat nach dem Wort "Daten" in Ihrem zweiten Codeblock haben, weil sonst ein Fehler ausgegeben wurde. Ich bin immer noch ein bisschen verwirrt darüber, was genau die for-Schleife tut. "Gruppe" wird als Python-Wörterbuch zurückgegeben (oder scheint es zumindest zu sein), aber ich habe immer noch Probleme beim Zugriff auf die einzelnen Eigenschaften.Zum Beispiel: {u'CaseDescription ': [{u'text': u'NAME '}] Mein Verständnis ist der Text u'CaseDescription' sollte der Schlüsselname sein, um es zu verweisen, aber es scheint nicht zu sein Arbeit. –

+0

@HunterBeach, 'data' ist eigentlich eine Liste von Wörterbüchern –

+0

@HunterBeach meine Formulierung war ein bisschen unpassend, Jordans Bearbeitung klärt es ein bisschen mehr. Wenn Sie noch verwirrt sind, können Sie Ihre Frage mit Code aktualisieren, den Sie gerade versuchen, um Ihr Ziel zu erreichen –