Zugriff auf JSON-Elemente

82

Ich erhalte die Wetterinformationen von einer URL.

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

und was ich bekomme ist:

{
  "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"
    }]        
 }
}

Wie kann ich auf ein beliebiges Element zugreifen?

Wenn ich das tue: print wjson['data']['current_condition']['temp_C']Ich erhalte die Fehlermeldung:

Zeichenfolgenindizes müssen Ganzzahlen sein, nicht str.

Doniyor
quelle
2
requestsist eine erstaunliche Möglichkeit, mit JSON auszukommen. Wenn Sie mit komplizierten URLs umgehen, verwenden Sie sie.
Surya

Antworten:

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

Was Sie von der URL erhalten, ist eine JSON-Zeichenfolge. Und Sie können es nicht direkt mit dem Index analysieren. Sie sollten es in ein Diktat von konvertieren json.loadsund es dann mit dem Index analysieren.

Anstelle der Verwendung .read()speichert es in dem Speicher zwischen und es dann lesen json, damit jsones aus der Datei direkt laden:

wjdata = json.load(urllib2.urlopen('url'))
Yarkee
quelle
1
cool, es funktioniert jetzt. Kannst du mir bitte erklären, warum das so ist?
Doniyor
1
Yarkee hat @doniyor bereits erklärt. Es ist, weil es mit einem Diktat konvertiert wurde json.loads(). Sie versuchen nur, direkt auf JSON zuzugreifen ... ohne sich in etwas zu verwandeln, das von Python gelesen werden kann, oder ein Modul zu verwenden, um dies zu tun.
Ben
3
Besser json.load(urllib2.urlopen('url')), es lädt es direkt, anstatt es zwischenzeitlich im Speicher zu speichern
jamylak
1
Gibt es eine Möglichkeit, dies zurückzugeben, ohne den Index zu kennen, vorausgesetzt, es gibt mehr aktuelle Bedingungseinträge?
user2019182
Ich erhalte diesen TypeError: Listenindizes müssen Ganzzahlen sein, nicht Unicode. Immer wenn ich versuche, Wörter für die Array-Anzeigen zu verwenden. Wie kann ich diese Arbeit so machen wie Sie?
Ian Tait
28

Hier ist eine alternative Lösung mit Anfragen :

import requests
wjdata = requests.get('url').json()
print wjdata['data']['current_condition'][0]['temp_C']
Alecxe
quelle
1
Gibt es eine Möglichkeit, dies zurückzugeben, ohne den Index zu kennen, vorausgesetzt, es gibt mehr aktuelle Bedingungseinträge?
user2019182
7

'temp_C' ist ein Schlüssel im Wörterbuch, der sich in einer Liste befindet, die sich in einem Wörterbuch befindet

So funktioniert es:

wjson['data']['current_condition'][0]['temp_C']
>> '10'
HazimoRa3d
quelle
1

Nur für mehr als eine Option ... Sie können es auch so machen:

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

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

Ich hoffe das kann helfen.

Deividson Calixto
quelle
0

Eine andere alternative Möglichkeit, die get-Methode mit Anforderungen zu verwenden:

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