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.