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.


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'))

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']

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'

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')

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.