Acceda a un campo particular en datos JSON nesteds arbitrariamente

{ "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 puedo capturar el contenido “FOLLOW ME PLEASE” de este json?

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

Esta captura el todo dentro de ['announcement'] y no puedo hacer ['announcement']['content'] .

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

Gracias de antemano por ayudarme a resolver esto.

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á observar sus datos .

En primer lugar, vamos a presentar 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 trazado 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 mediante la clave video_info , que a su vez se accede mediante data .

Entonces, en resumen, “desciende” la escalera que es “datos” utilizando los siguientes “peldaños”:

  1. data , un diccionario
  2. video_info , una lista de dictados
  3. announcement , un dictado en el primer dictado de la lista de dictados.
  4. content reside como parte de los datos de 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 basta. De lo contrario, necesitarías iterar :

 for k in j: ... 

Siguiente,

 l = k['announcement'] 

Ahora, l es JSON datos. Cárgalo –

 import json m = json.loads(l) 

Por último,

 content = m['content'] 

 print(content) 'FOLLOW ME PLEASE' 

Esperamos que esto sirva de guía en caso de tener consultas futuras de esta naturaleza.

Tienes datos JSON nesteds ; La cadena asociada con la clave 'annoucement' es, en sí misma, otro documento JSON incrustado, separado.

Tendrás que decodificar esa cadena primero:

 import json replay_data = raw_replay_data['data']['video_info'][0] announcement = json.loads(replay_(data['announcement']) print(announcement['content']) 

luego manejar el diccionario resultante desde allí.

El contenido del "announcement" es otra cadena JSON. Descodifíquelo y luego acceda a su contenido como lo estaba haciendo con los objetos externos.