@Mpyrulearn

Как парсить JSON файл с переменной структурой данных?

Как работать с обьектами JSON, когда они имеют переменный тип?

Например я хочу найти все ссылки в экспорте лога чата из TELEGRAM, там "text" то просто строка, то список, внутри которого словарь.

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

У меня проблема в том, что если пытаться перебирать "text" как список - будут ошибки, из за того, что иногда он не имеет списка.
можно конечно подавлять ошибки, но это тоже имхо не правильно.

набросок кода с костылями (подавление ошибок, элемент списка жеско задан):

import json

json_str = '''
[
  {
   "id": 5,
   "type": "message",
   "date": "2019-01-02T12:05:43",
   "from": "nik",
   "from_id": 12457887,
   "text": "hi!"
  },
  {
   "id": 6,
   "type": "message",
   "date": "2019-01-02T12:05:45",
   "from": "nik2",
   "from_id": 22457877,
   "text": [
    "hi tyt info!",
    {
     "type": "link",
     "text": "https://telegra.ph/film-05-01"
    },
    ""
   ]
  }
]
'''

json_data = json.loads(json_str)

for stroka in json_data:
    http_data = stroka['text']
    try:
        print(http_data[1]['text']) # тут номер [1] элемента со ссылкой в списке думаю может меняться, придется перебирать все элементы?
    except:
        pass


p.s. можно конечно считать весь json файл одной большой строкой и вытаскивать данные строковыми методами или регулярками, но это имхо ужасный костыль, хочется разобраться как пользоваться структурами данных в json'ne.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Проверять типы нужных данных?

for stroka in json_data:
    http_data = stroka['text']
    
    if isinstance(http_data, list):
        for chunk in http_data:
            if isinstance(chunk, dict):
                print(chunk.get('text'))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы