Разбор JSON
-
ladik
- developer
- Сообщения: 275
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Разбор JSON
Товарищи, здравствуйте! Решил на досуге побаловаться с Telegram ботами. Когда получаемые ботом сообщения одного типа, проблем в их разборке нет. Цепляешь тайпдеф к входу type функции Unflatten From JSON и получаешь заполненную структуру.
Сложности возникают, когда приходит сообщение другого типа (например было типа group, стало private ) или несколько сообщений разных типов. Как в таком случае "парсить" JSON . На ум приходит только в разных кейсах проверять первые сообщения на отдельный тип, если совпало, сохранять сообщение в общую структуру для всех сообщений "message" и удалять его из "сырой" строки и так по кругу, пока строка не будет пустой. Но это какие-то костыли получаются. Может у кого-то есть идеи, как сделать проще и красивее это дело. Дорогу осилит идущий.
-
IvanLis
- guru
- Сообщения: 5463
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Разбор JSON
Народ ленивый, нужно взять готовое и что бы из коробочки работало .ladik писал(а):На ум приходит только в разных кейсах проверять первые сообщения на отдельный тип, если совпало, сохранять сообщение в общую структуру для всех сообщений "message" и удалять его из "сырой" строки и так по кругу, пока строка не будет пустой. Но это какие-то костыли получаются. Может у кого-то есть идеи, как сделать проще и красивее это дело.
Пути
1. Можно просто поиском искать необходимый фрагмент текста, например "type": "private" и т.д., что позволит определить класс пакета и подать нужный TypeDef.
2. Можно сделать перебором. Например подали первый TypeDef, возникла ошибка.... пробуем следующий. И т.д. до победы.
3. В конце концов, можно самому разобрать пакет используя регулярные выражения.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
Pavel Krivozubov
- professor
- Сообщения: 4421
- Зарегистрирован: 07 фев 2008, 16:39
- Награды: 3
- Версия LabVIEW: 7.0 - 2013
- Откуда: г. Электросталь
- Благодарил (а): 24 раза
- Поблагодарили: 9 раз
- Контактная информация:
Re: Разбор JSON
Вадим, а ты спрашивал на нашем канале Telegram про это?
Правила форума
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
-
ladik
- developer
- Сообщения: 275
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Разбор JSON
Спасибо, что-то похожее я примерно и предполагал.Пути
1. Можно просто поиском искать необходимый фрагмент текста, например "type": "private" и т.д., что позволит определить класс пакета и подать нужный TypeDef.
2. Можно сделать перебором. Например подали первый TypeDef, возникла ошибка.... пробуем следующий. И т.д. до победы.
3. В конце концов, можно самому разобрать пакет используя регулярные выражения.
Дорогу осилит идущий.
-
- developer
- Сообщения: 257
- Зарегистрирован: 03 янв 2014, 19:37
- Версия LabVIEW: 2016
- Откуда: Украина, Киев
- Контактная информация:
Re: Разбор JSON
при парсинге JSON пакета не обязательно иметь полный готовый тайп-деф.
К примеру, имеем JSON-паке вида
{
"type": "message",
"data":"data"
}
Если мы подадим на вход Unflatten from JSON кластер только со строкой именованной type - мы на выходе получим этот элемент.
Таким образом можно распарсить пакет по частям так, как нам надо. Это даёт нам гибкость при парсинге JSON.
Мне такой подход нравится намного больше, чем перебор тайпдефов или парсинг строки по токенам и регулярным выражениям.
К примеру, имеем JSON-паке вида
{
"type": "message",
"data":"data"
}
Если мы подадим на вход Unflatten from JSON кластер только со строкой именованной type - мы на выходе получим этот элемент.
Таким образом можно распарсить пакет по частям так, как нам надо. Это даёт нам гибкость при парсинге JSON.
Мне такой подход нравится намного больше, чем перебор тайпдефов или парсинг строки по токенам и регулярным выражениям.
колдооооовствооооо! (С)
-
ladik
- developer
- Сообщения: 275
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Разбор JSON
Если мы подадим на вход Unflatten from JSON кластер только со строкой именованной type - мы на выходе получим этот элемент.
Таким образом можно распарсить пакет по частям так, как нам надо. Это даёт нам гибкость при парсинге JSON.
Такой подход хорош, когда на выходе нужно иметь кластер только с отдельными полями. Но тем не менее, кластер на входе "type and defaults" должен соответствовать структуре расположения нужных элементов в исходном пакете, в противном случае ошибка и после несовпавших полей пустые значения. А заранее неизвестно какой тип сообщения пришёл, отсюда и сложности разбора.
Для моей задачи подошло простое решение: заменяю в строке все поля "first_name" на "title"или наоборот и привожу кластер к общему виду (отбрасываю различающиеся и не нужные мне поля, например all_members_are_administrators, language_code). Так как в данном случае сообщения различаются несильно, такой подход работает.
Дорогу осилит идущий.