2013-04-21 29 views
33

Otrzymuję informacje o pogodzie z adresu URL.Uzyskiwanie dostępu do elementów JSON

weather = urllib2.urlopen('url') 
wjson = weather.read() 

i co otrzymuję to:

{ 
    "data": { 
    "current_condition": [{ 
     "cloudcover": "0", 
     "humidity": "54", 
     "observation_time": "08:49 AM", 
     "precipMM": "0.0", 
     "pressure": "1025", 
     "temp_C": "10", 
     "temp_F": "50", 
     "visibility": "10", 
     "weatherCode": "113", 
     "weatherDesc": [{ 
      "value": "Sunny" 
     }], 
     "weatherIconUrl": [{ 
      "value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png" 
     }], 
     "winddir16Point": "E", 
     "winddirDegree": "100", 
     "windspeedKmph": "22", 
     "windspeedMiles": "14" 
    }]   
} 
} 

Jak mogę uzyskać dostęp do dowolnego elementu chcę?

jeśli robię: print wjson['data']['current_condition']['temp_C'] ja dostaję błąd mówiąc:

indeksy łańcuchowe muszą być liczbami całkowitymi, nie ul.

+1

'requests' jest niesamowity sposób dogadać się z JSON..If obchodzenia skomplikowany URL .. go używać. – Surya

Odpowiedz

59
import json 
weather = urllib2.urlopen('url') 
wjson = weather.read() 
wjdata = json.loads(wjson) 
print wjdata['data']['current_condition'][0]['temp_C'] 

Co można uzyskać z url jest ciągiem JSON. I nie można sparsować bezpośrednio za pomocą indeksu. Powinieneś przekonwertować go na dyktafon przez json.loads, a następnie możesz go sparsować za pomocą indeksu.

Zamiast .read() aby tymczasowo zapisać go w pamięci, a następnie odczytać je json pozwalają json załadować go bezpośrednio z pliku:

wjdata = json.load(urllib2.urlopen('url')) 
+1

fajne, teraz działa. czy możesz mi wyjaśnić, dlaczego tak jest? – doniyor

+0

Yarkee wyjaśnił już @doniyor. To dlatego, że został przekonwertowany na dykta przy użyciu 'json.loads()'. Po prostu próbujesz uzyskać bezpośredni dostęp do JSON ... bez przekształcania się w nic czytelnego dla Pythona lub użycie modułu do tego. – Ben

+3

Lepiej zrób 'json.load (urllib2.urlopen ('url'))), więc ładuje go bezpośrednio zamiast pośrednio zapisując go do pamięci – jamylak

19

Oto alternatywne rozwiązanie używając requests:

import requests 
wjdata = requests.get('url').json() 
print wjdata['data']['current_condition'][0]['temp_C'] 
+0

Czy istnieje sposób na zwrócenie tego bez znajomości indeksu, zakładając, że było więcej aktualnych wpisów warunku? – user2019182

3

"temp_C" jest kluczem wewnątrz słownika znajdującym się na liście znajdującej się w słowniku

ten sposób działa:

wjson['data']['current_condition'][0]['temp_C'] 
>> '10' 
Powiązane problemy