web-dev-qa-db-fra.com

Accéder à un champ particulier dans des données JSON imbriquées arbitrairement

{
  "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": "",

Comment puis-je récupérer le contenu "FOLLOW ME PLEASE" de ce json?

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

Cette capture le tout avec ['announcement'] et je ne peux pas faire ['announcement']['content'].

Quel est le bon moyen de le faire?

Merci d'avance de m'avoir aidé à comprendre cela.

13
aquatic7

En une seule ligne -

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

Pour vous aider à comprendre comment accéder aux données (vous n'avez donc pas à demander à nouveau), vous devrez regarder vos données .

Tout d'abord, organisons bien vos données. Vous pouvez soit utiliser json.dumps(data, indent=4), soit utiliser un outil en ligne comme 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'
} 

*** Notez que les données de la clé announcement sont en fait plus des données json, que j'ai présentées sur des lignes distinctes.

Tout d'abord, découvrez où résident vos données. Vous recherchez les données dans la clé content, accessible par la clé announcement, qui fait partie d'un dictionnaire dans une liste de dictés, accessible par la touche video_info, Qui est à son tour accessible par data.

Donc, en résumé, "descendez" l'échelle qui est "données" en utilisant les "échelons" suivants -

  1. data, un dictionnaire
  2. video_info, Une liste de dict
  3. announcement, un dict dans le premier dict de la liste des dict
  4. content résidant dans le cadre des données json.

Premier,

i = data['data']

Prochain,

j = i['video_info']

Prochain,

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

Si vous ne voulez que le premier élément, cela suffit. Sinon, vous devrez itérer :

for k in j:
    ...

Prochain,

l = k['announcement']

Maintenant, l est une donnée JSON. Charge le -

import json
m = json.loads(l)

Enfin,

content = m['content']
print(content)
'FOLLOW ME PLEASE'

J'espère que cela devrait servir de guide si vous avez de futures questions de cette nature.

22
cs95

Vous avez données JSON imbriquées; la chaîne associée au 'annoucement' key est en soi un autre document JSON intégré et séparé.

Vous devrez d'abord décoder cette chaîne:

import json

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

puis gérez le dictionnaire résultant à partir de là.

3
Martijn Pieters

Le contenu de "announcement" est une autre chaîne JSON. Décodez-le puis accédez à son contenu comme vous le faisiez avec les objets extérieurs.

0