2017-01-24 5 views
1

Bevor Sie urteilen und denken Sie sich 'Ich habe diese Frage tausend Mal gesehen' bitte lesen Sie weiter und geben Sie mir eine Chance, ich habe das Internet für Antworten, aber scheint keine Hilfe zu finden.TypeError: String-Indizes müssen integer Fehler sein, wenn Json mit Python analysiert

Also ich versuche json von einem API zu analysieren, die ich den folgenden Code obtain mit:

url = 'https://api.companieshouse.gov.uk/company/' + companyno + '/charges' 

r = requests.get(url, auth=('API KEY', '')) 

data = r.json() 

ich einfach ziemlich spezifische Werte aus der json erhalten kann, zum Beispiel mit diesem Code:

for each in data['items']: 
    print(each['created_on']) 

, die zurückgibt:

2016-11-08 
2016-11-08 
2016-11-08 
2015-03-27 
2015-03-27 
2015-03-27 
2015-03-27 
2015-03-27 
2007-10-10 
2007-09-28 
2007-09-19 

Und das ist genau das, was ich will, es funktioniert für andere Schlüssel zu.

Allerdings gibt es ein Bit des JSON, auf das ich anscheinend nicht zugreifen kann, ich habe das JSON leicht bearbeitet, um die Veröffentlichung sensibler Daten zu vermeiden (die sowieso öffentlich zugänglich sind, aber vorsichtig sein) weitgehend unverändert ist:

{ 
    'items':[ 
     { 
     'created_on':'2016-11-08', 
     'etag':'DELETED', 
     'classification':{ 
      'type':'charge-description', 
      'description':'A registered charge' 
     }, 
     'particulars':{ 
      'contains_negative_pledge':True, 
      'description':'DELETED', 
      'type':'brief-description' 
     }, 
     'transactions':[ 
      { 
       'links':{ 
        'filing':'DELETED' 
       }, 
       'filing_type':'create-charge-with-deed', 
       'delivered_on':'2016-11-21' 
      } 
     ], 
     'links':{ 
      'self':'DELETED' 
     }, 
     'charge_code':'DELETED', 
     'delivered_on':'2016-11-21', 
     'status':'outstanding', 
     'persons_entitled':[ 
      { 
       'name':'DELETED' 
      }, 
      { 
       'name':'DELETED' 
      } 
     ], 
     'charge_number':59 
     }, 
     { 
     'transactions':[ 
      { 
       'delivered_on':'2016-11-10', 
       'links':{ 
        'filing':'DELETED' 
       }, 
       'filing_type':'create-charge-with-deed' 
      } 
     ], 
     'particulars':{ 
      'contains_negative_pledge':True, 
      'contains_fixed_charge':True, 
      'floating_charge_covers_all':True, 
      'contains_floating_charge':True 
     }, 
     'persons_entitled':[ 
      { 
       'name':'DELETED' 
      } 
     ], 
     'charge_number':58, 
     'status':'outstanding', 
     'charge_code':'DELETED', 
     'links':{ 
      'self':'DELETED' 
     }, 

es ist die [Artikel, Links, Selbst] Daten

Wenn ich den folgenden Code verwenden, um zu versuchen und darauf zugreifen:

for each in data['items']['links']: 
    print(each['self']) 

Ich erhalte die folgenden Fehler:

File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers or slices, not str 

Und wenn ich versuche, darauf zuzugreifen mit dem folgenden Code:

for each in data['items'][0]['links']: 
     print(each['self']) 

ich diesen Fehler:

File "<stdin>", line 2, in <module> 
TypeError: string indices must be integers 

Ich kann nicht nur verstehen, warum Es wirft diesen Fehler auf mich, alle anderen Antworten im Internet zeigen auf die Tatsache, dass ich versuche, eine Zeichenfolge und nicht ein tatsächliches Json-Objekt zu analysieren, aber immer wenn ich den Befehl ausführen:

type(data) 

es zurück:

<class 'dict'> 

So weiß ich, es ist ein Wörterbuch ist und dass sie über die Tasten zu durchlaufen können.

Ich bin mir sicher, dass ich einen sehr dummen Fehler mache und wenn ja, entschuldige ich mich, aber ich kann einfach nicht herausfinden, was ich falsch mache, kann jemand helfen?

p.s. Entschuldigung für die lange Post.

EDIT:

Vielen Dank für Ihre Antworten, scheinen die Dinge Sinn, jetzt zu machen. Wir waren alle Lernenden an einem Punkt! :)

+0

Können Sie eine Arbeits json schreiben ? Die von Ihnen gepostete scheint unvollständig, so dass es schwer ist, es zu testen. – 098799

Antwort

4

Der Schlüssel 'links' verweist auf einen Wörterbuchwert. Wenn Sie also darüber iterieren, erhalten Sie die Schlüssel des Wörterbuchs, in diesem Fall 'self'.Sie tun sollten:

for k, v in data['items'][0]['links'].items(): 
    if k == 'self': 
     print(v) 

Oder Sie können einfach den Wert an den Schlüssel 'self' zugreifen, ohne Iterieren:

print(data['items'][0]['links']['self']) 
+0

Oder 'print (data ['items']] [0] ['links']. Get ('self'))' falls dieser Schlüssel nicht existiert. –

+0

Vielen Dank, fühlen Sie sich wie etwas gerade geklickt über Parsing json :) – Ruthus99

2

Falls es in dieser Antwort mehr als ein Element ist, tun

for item in data['items']: 
    print(item['links']['self']) 

sonst ist print(data['items'][0]['links']['self']) ausreichend.

Alternativ können Sie verwenden JSONPath (die XPath ähnlich ist): { 'self':'DELETED' }

Iterieren über ein dict liefert seine Schlüssel:

import jsonpath_rw as jp 

for match in jp.parse('items[*].links.self').find(data): 
    print(match.value) 
2

data['items'][0]['links']: ein dict ist in diesem Fall nur eine, 'selbst'. `‚Selbst‘[‚Selbst‘] Konten für Ihre Fehler

Was möchten Sie ist möglicherweise nur data['items'][0]['links']['self'], oder über einen der dict Methoden iterieren .keys(), .values() oder .items()

for key,value in data['items'][0]['links'].items() 
    print(key,":",value) 
+0

geschlagen zu ihm. Seufzer. – nigel222

Verwandte Themen