python - Acceda a un campo particular en datos JSON anidados arbitrariamente




list dictionary (2)

Esta pregunta ya tiene una respuesta aquí:

{
  "status": "200",
  "msg": "",
  "data": {
    "time": "1515580011",
    "video_info": [
      {
          "announcement": "{\"announcement_id\":\"6\",\"name\":\"INS\\u8d26\\u53f7\",\"icon\":\"http:\\\/\\\/liveme.cms.ksmobile.net\\\/live\\\/announcement\\\/2017-08-18_19:44:54\\\/ins.png\",\"icon_new\":\"http:\\\/\\\/liveme.cms.ksmobile.net\\\/live\\\/announcement\\\/2017-10-20_22:24:38\\\/4.png\",\"videoid\":\"15154610218328614178\",\"content\":\"FOLLOW ME PLEASE\",\"x_coordinate\":\"0.22\",\"y_coordinate\":\"0.23\"}",
          "announcement_shop": "",

¿Cómo obtengo el contenido "SÍGUEME POR FAVOR" de este json?

replay_data = raw_replay_data['data']['video_info'][0]
announcement = replay_data['announcement']

Esto toma todo dentro ['announcement'] y no puedo hacer ['announcement']['content'] .

¿Cuál es la forma correcta de hacer esto?

Gracias de antemano por ayudarme a resolver esto.


El contenido del "announcement" es otra cadena JSON. Descifrarlo y luego acceder a su contenido como lo estaba haciendo con los objetos externos.


En una sola línea

>>> json.loads(data['data']['video_info'][0]['announcement'])['content']
'FOLLOW ME PLEASE'

Para ayudarlo a comprender cómo acceder a los datos (para que no tenga que volver a preguntar), deberá mirar sus datos .

Primero, presentemos sus datos muy bien. Puede usar json.dumps(data, indent=4) o puede usar una herramienta en línea como JSONLint.com .

{
    'data': {
        'time': '1515580011',
        'video_info': [{
            'announcement': (    # ***
            """{
                "announcement_id": "6",
                "name": "INS\\u8d26\\u53f7",
                "icon": "http:\\\\/\\\\/liveme.cms.ksmobile.net\\\\/live\\\\/announcement\\\\/2017-08-18_19:44:54\\\\/ins.png",
                "icon_new": "http:\\\\/\\\\/liveme.cms.ksmobile.net\\\\/live\\\\/announcement\\\\/2017-10-20_22:24:38\\\\/4.png",
                "videoid": "15154610218328614178",
                "content": "FOLLOW ME PLEASE",
                "x_coordinate": "0.22",
                "y_coordinate": "0.23"
            }"""),
            'announcement_shop': ''
        }]
    },
    'msg': '',
    'status': '200'
} 

*** Tenga en cuenta que los datos en la clave de announcement son en realidad más datos json, que he presentado en líneas separadas.

Primero, averigüe dónde residen sus datos. Está buscando los datos en la clave de content , a la que se accede mediante la clave de announcement , que forma parte de un diccionario dentro de una lista de dictados, a la que se puede acceder con la clave video_info , a la que a su vez se accede mediante data .

Entonces, en resumen, "descienda" la escalera que es "datos" usando los siguientes "peldaños":

  1. data , un diccionario
  2. video_info , una lista de dictos
  3. announcement , un dict en el primer dict de la lista de dictados
  4. content reside como parte de los datos json.

Primero,

i = data['data']

Siguiente,

j = i['video_info']

Siguiente,

k = j[0] # since this is a list

Si solo quieres el primer elemento, esto es suficiente. De lo contrario, necesitaría iterar :

for k in j:
    ...

Siguiente,

l = k['announcement']

Ahora, l son datos JSON. Cárgalo -

import json
m = json.loads(l)

Por último,

content = m['content']

print(content)
'FOLLOW ME PLEASE'

Con suerte, esto debería servir como guía si tiene consultas futuras de esta naturaleza.





dictionary