Accediendo a elementos JSON

81

Obtengo la información meteorológica de una URL.

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

y lo que obtengo es:

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

¿Cómo puedo acceder a cualquier elemento que desee?

si lo hago: print wjson['data']['current_condition']['temp_C']obtengo un error que dice:

los índices de cadena deben ser enteros, no str.

donante
fuente
2
requestses una manera asombrosa de llevarse bien con JSON ... Si está manejando URL complicadas ... úselo.
Surya

Respuestas:

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

Lo que obtienes de la URL es una cadena json. Y no puede analizarlo directamente con index. Debería convertirlo en un diccionario json.loadsy luego puede analizarlo con index.

En lugar de usar .read()para guardarlo de forma intermedia en la memoria y luego leerlo json, permite jsoncargarlo directamente desde el archivo:

wjdata = json.load(urllib2.urlopen('url'))
Yarkee
fuente
1
genial, está funcionando ahora. ¿Puedes explicarme por qué es esto?
donante
1
Yarkee ya lo ha explicado @doniyor. Es porque se ha convertido a un dict usando json.loads(). Solo está tratando de acceder al JSON directamente ... sin transformarse en nada legible por Python o usar un módulo para hacerlo.
Ben
3
Mejor hazlo, json.load(urllib2.urlopen('url'))lo carga directamente en lugar de guardarlo de forma intermedia en la memoria
jamylak
1
¿Hay alguna manera de devolver esto sin conocer el índice, suponiendo que hubiera más entradas de condición actual?
user2019182
Recibo este TypeError: los índices de lista deben ser enteros, no unicode Siempre que intento usar palabras para los índices de matriz. ¿Cómo puedo hacer que esto funcione como tú?
Ian Tait
28

Aquí hay una solución alternativa que usa solicitudes :

import requests
wjdata = requests.get('url').json()
print wjdata['data']['current_condition'][0]['temp_C']
Alecxe
fuente
1
¿Hay alguna manera de devolver esto sin conocer el índice, suponiendo que hubiera más entradas de condición actual?
user2019182
7

'temp_C' es una clave dentro del diccionario que está dentro de una lista que está dentro de un diccionario

De esta manera funciona:

wjson['data']['current_condition'][0]['temp_C']
>> '10'
HazimoRa3d
fuente
0

Otra forma alternativa de usar el método get con solicitudes:

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

Solo por más de una opción ... También puedes hacerlo de esta manera:

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

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

Espero que esto pueda ayudar.

Deividson Calixto
fuente