Вопрос-Ответ

How can I access the nested data in this complex JSON, which includes another JSON document as one of the strings?

Как я могу получить доступ к вложенным данным в этом сложном JSON, который включает в себя другой документ JSON в качестве одной из строк?

У меня есть некоторые данные JSON, такие как:

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

и т.д.

Как мне получить содержимое"FOLLOW ME PLEASE"? Я пытался использовать

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

Но теперь announcement это строка, представляющая больше данных JSON. Я не могу продолжить индексирование announcement['content'] результатов в TypeError: string indices must be integers.

Как я могу получить желаемую строку "правильным" способом, т. Е. С учетом фактической структуры данных?

Переведено автоматически
Ответ 1

В одной строке -

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

Чтобы помочь вам понять, как получить доступ к данным (чтобы вам не приходилось переспрашивать), вам нужно просмотреть свои данные.

Сначала давайте красиво расположим ваши данные. Вы можете использовать json.dumps(data, indent=4), или вы можете использовать онлайн-инструмент, такой как 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'
}

*** Обратите внимание, что данные в announcement ключе на самом деле больше данных json, которые я разместил в отдельных строках.

Сначала выясните, где находятся ваши данные. Вы ищете данные в content ключе, доступ к которым осуществляется с помощью announcement ключа, который является частью словаря внутри списка dicts , доступ к которому может быть получен с помощью video_info ключа, к которому, в свою очередь, обращается data.

Итак, вкратце, "спуститесь" по лестнице, которая является "данными", используя следующие "ступени" -


  1. data, словарь

  2. video_info, список dicts

  3. announcement, dict в первом dict списка dicts

  4. content находится как часть данных json.


Первый,

i = data['data']

Далее,

j = i['video_info']

Далее,

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

Если вам нужен только первый элемент, этого достаточно. В противном случае вам нужно будет выполнить итерацию:

for k in j:
...

Далее,

l = k['announcement']

Теперь, l это данные JSON. Загрузите их -

import json
m = json.loads(l)

Наконец,

content = m['content']

print(content)
'FOLLOW ME PLEASE'

Мы надеемся, это послужит руководством, если у вас возникнут подобные запросы в будущем.

Ответ 2

У вас есть вложенные данные JSON; строка, связанная с 'annoucement' ключом, сама по себе является другим, отдельным встроенным документом JSON.

Сначала вам придется расшифровать эту строку:

import json

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

затем обработайте полученный словарь оттуда.

Ответ 3

Содержимое "announcement" - это еще одна строка JSON. Расшифруйте ее, а затем получите доступ к ее содержимому, как вы делали с внешними объектами.

python json list dictionary