Разбор JSON

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
Ответить
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 275
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Разбор JSON

Сообщение ladik »

Товарищи, здравствуйте! Решил на досуге побаловаться с Telegram ботами. Когда получаемые ботом сообщения одного типа, проблем в их разборке нет. Цепляешь тайпдеф к входу type функции Unflatten From JSON и получаешь заполненную структуру.
JSON Parse.png
JSON Parse.png (18.31 КБ) 6035 просмотров
Сложности возникают, когда приходит сообщение другого типа (например было типа group, стало private ) или несколько сообщений разных типов. Как в таком случае "парсить" JSON :dntknw:.
JSON Messages.png
На ум приходит только в разных кейсах проверять первые сообщения на отдельный тип, если совпало, сохранять сообщение в общую структуру для всех сообщений "message" и удалять его из "сырой" строки и так по кругу, пока строка не будет пустой. Но это какие-то костыли получаются. Может у кого-то есть идеи, как сделать проще и красивее это дело. :bye: :thank:
Дорогу осилит идущий.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Разбор JSON

Сообщение IvanLis »

ladik писал(а):На ум приходит только в разных кейсах проверять первые сообщения на отдельный тип, если совпало, сохранять сообщение в общую структуру для всех сообщений "message" и удалять его из "сырой" строки и так по кругу, пока строка не будет пустой. Но это какие-то костыли получаются. Может у кого-то есть идеи, как сделать проще и красивее это дело. :bye: :thank:
Народ ленивый, нужно взять готовое и что бы из коробочки работало :wink: .

Пути
1. Можно просто поиском искать необходимый фрагмент текста, например "type": "private" и т.д., что позволит определить класс пакета и подать нужный TypeDef.
2. Можно сделать перебором. Например подали первый TypeDef, возникла ошибка.... пробуем следующий. И т.д. до победы.
3. В конце концов, можно самому разобрать пакет используя регулярные выражения.
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Разбор JSON

Сообщение Pavel Krivozubov »

Вадим, а ты спрашивал на нашем канале Telegram про это?
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 275
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Разбор JSON

Сообщение ladik »

Нет, что-то не подумал об этом.
Дорогу осилит идущий.
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 275
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Разбор JSON

Сообщение ladik »

Пути
1. Можно просто поиском искать необходимый фрагмент текста, например "type": "private" и т.д., что позволит определить класс пакета и подать нужный TypeDef.
2. Можно сделать перебором. Например подали первый TypeDef, возникла ошибка.... пробуем следующий. И т.д. до победы.
3. В конце концов, можно самому разобрать пакет используя регулярные выражения.
Спасибо, что-то похожее я примерно и предполагал.
Дорогу осилит идущий.
AlexanderKonoval
developer
developer
Сообщения: 257
Зарегистрирован: 03 янв 2014, 19:37
Версия LabVIEW: 2016
Откуда: Украина, Киев
Контактная информация:

Re: Разбор JSON

Сообщение AlexanderKonoval »

при парсинге JSON пакета не обязательно иметь полный готовый тайп-деф.
К примеру, имеем JSON-паке вида
{
"type": "message",
"data":"data"
}

Если мы подадим на вход Unflatten from JSON кластер только со строкой именованной type - мы на выходе получим этот элемент.
Таким образом можно распарсить пакет по частям так, как нам надо. Это даёт нам гибкость при парсинге JSON.

Мне такой подход нравится намного больше, чем перебор тайпдефов или парсинг строки по токенам и регулярным выражениям.
колдооооовствооооо! (С)
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 275
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Разбор JSON

Сообщение ladik »

Если мы подадим на вход Unflatten from JSON кластер только со строкой именованной type - мы на выходе получим этот элемент.
Таким образом можно распарсить пакет по частям так, как нам надо. Это даёт нам гибкость при парсинге JSON.

Такой подход хорош, когда на выходе нужно иметь кластер только с отдельными полями.
JSON Detailed.png
Но тем не менее, кластер на входе "type and defaults" должен соответствовать структуре расположения нужных элементов в исходном пакете, в противном случае ошибка и после несовпавших полей пустые значения.
JSON Unflatten Error.PNG
А заранее неизвестно какой тип сообщения пришёл, отсюда и сложности разбора.
Для моей задачи подошло простое решение: заменяю в строке все поля "first_name" на "title"или наоборот и привожу кластер к общему виду (отбрасываю различающиеся и не нужные мне поля, например all_members_are_administrators, language_code). Так как в данном случае сообщения различаются несильно, такой подход работает.
Solution.png
Дорогу осилит идущий.
Ответить

Вернуться в «Общие»