Dostęp do elementów JSON

82

Otrzymuję informacje o pogodzie z adresu URL.

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

a otrzymuję:

{
  "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, który chcę?

jeśli to zrobię: print wjson['data']['current_condition']['temp_C']pojawia się błąd mówiący:

indeksy łańcuchów muszą być liczbami całkowitymi, a nie str.

doniyor
źródło
2
requeststo niesamowity sposób na dogadanie się z JSON .. Jeśli zajmujesz się skomplikowanymi adresami URL ... użyj go.
Surya,

Odpowiedzi:

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

To, co otrzymujesz z adresu URL, to ciąg json. I nie możesz go bezpośrednio przeanalizować za pomocą indeksu. Powinieneś przekonwertować go na dykt, json.loadsa następnie możesz go przeanalizować za pomocą indeksu.

Zamiast używać .read()do pośredniego zapisywania go w pamięci, a następnie odczytu json, pozwól jsonzaładować go bezpośrednio z pliku:

wjdata = json.load(urllib2.urlopen('url'))
Yarkee
źródło
1
fajnie, teraz działa. czy możesz mi wyjaśnić, dlaczego tak jest?
doniyor
1
Yarkee już wyjaśnił @doniyor. To dlatego, że został przekonwertowany na dykt za pomocą json.loads(). Po prostu próbujesz uzyskać bezpośredni dostęp do JSON ... bez przekształcania w cokolwiek czytelnego dla Pythona lub używania do tego modułu.
Ben
3
Lepiej zrób json.load(urllib2.urlopen('url'))to bezpośrednio, zamiast pośrednio zapisywać w pamięci
jamylak
1
Czy istnieje sposób na zwrócenie tego bez znajomości indeksu, zakładając, że było więcej wpisów dotyczących aktualnych warunków?
user2019182
Otrzymuję ten TypeError: indeksy listy muszą być liczbami całkowitymi, a nie kodem Unicode Za każdym razem, gdy próbuję użyć słów dla wskazań tablicy. Jak mogę to zrobić tak, jak masz?
Ian Tait
28

Oto alternatywne rozwiązanie wykorzystujące żądania :

import requests
wjdata = requests.get('url').json()
print wjdata['data']['current_condition'][0]['temp_C']
alecxe
źródło
1
Czy istnieje sposób na zwrócenie tego bez znajomości indeksu, zakładając, że było więcej wpisów dotyczących aktualnych warunków?
user2019182
7

„temp_C” jest kluczem wewnątrz słownika, który znajduje się na liście wewnątrz słownika

W ten sposób działa:

wjson['data']['current_condition'][0]['temp_C']
>> '10'
HazimoRa3d
źródło
2

Tylko dla więcej opcji ... Możesz to również zrobić w ten sposób:

MYJSON = {
    'username': 'gula_gut',
    'pics': '/0/myfavourite.jpeg',
    'id': '1'
}

#changing username
MYJSON['username'] = 'calixto'
print(MYJSON['username'])

Mam nadzieję, że to pomoże.

Deividson Calixto
źródło
0

Inny alternatywny sposób użycia metody get z żądaniami:

import requests
wjdata = requests.get('url').json()
print wjdata.get('data').get('current_condition')[0].get('temp_C')
Alok Tiwari
źródło