2017-07-17 5 views
0

Ich habe eine Python-App erstellt, um eine JSON-API zu analysieren.
Es gibt 3 Endpunkte und 1 davon beunruhigt mich.
Der Endpunkt ist: http://coinmarketcap.northpole.ro/history.json?coin=PCNFehler beim Analysieren einer JSON

Mein Code:

def getHistory(self, coin): 
    endpoint = "history.json?year=2017&coin=PCN" 
    data = urllib2.urlopen(self.url + endpoint).read() 
    data = json.loads(data)['history'] 
    return data 

def getOrder(self): 
    for c in self.getCoinsList(): 
     res = [] 

     symbol = c['symbol'] 
     price = self.getCoinPrice(symbol) 
     count = 0 
     count_days = len(self.getHistory(symbol)) 
     for h in self.getHistory(symbol): 
      if h['price']['usd'] > price: 
       ++count 
     percent_down = count_days/count * 100 
     line = {'symbol': symbol, 'price': price, 'percent_down': percent_down} 
     res.append(line) 
     return res 

Wenn ich versuche, die h['price']['usd'] ich diese haben zu erhalten:

File "coinmarketcap.py", line 39, in getOrder 
    if h['price']['usd'] > price: 
TypeError: string indices must be integers 

Wenn ich print type(h) tun es Unicode zurück.

+0

Verwendung So haben Sie bestätigt, dass h eine Zeichenfolge ist und Der Fehler besagt, dass String-Indizes ganze Zahlen sein müssen. Sie versuchen, die Zeichenfolge mit anderen Zeichenfolgen zu indizieren. – SuperShoot

+0

Aber ich möchte h ['price'] ['usd'] bekommen, wie kann ich das machen? – Pixel

+3

Ich nehme an, 'getHistory' gibt ein dict zurück und du iterierst es so:' für h in self.getHistory (symbol) '. Dies gibt Ihnen das dict _keys_, nicht _values_. Versuchen Sie 'h in self.getHistory (Symbol) .values ​​()'. –

Antwort

2

getHistory gibt einen dict, und wenn man über es wie folgt durchlaufen:

for h in self.getHistory(symbol): 

sind Sie über die dict Schlüssel iterieren, nicht Werte.

über den Wert iterieren, statt

for h in self.getHistory(symbol).values(): # .itervalues() in python2 
1

@Pixel verwenden, ich glaube, Sie gehen davon aus, dass for h in self.getHistory(symbol): gibt den Wert des Schlüssels, die nicht korrekt ist, den Schlüssel zurück.

Versuchen Sie das Wörterbuch und holen durch Keymapping speichern, wie diese,

json_data = self.getHistory(symbol) 
for h in json_data: 
    if json_data[h]['price']['usd'] > price: 
     ++count 

oder die Werte aus den Wörterbuchwerte abrufen,

for h in self.getHistory(symbol).values(): 
    if h['price']['usd'] > price: 
     ++count 
Verwandte Themen