Разбор JSON
-
ladik
- developer

- Сообщения: 277
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Разбор JSON
Товарищи, здравствуйте! Решил на досуге побаловаться с Telegram ботами. Когда получаемые ботом сообщения одного типа, проблем в их разборке нет. Цепляешь тайпдеф к входу type функции Unflatten From JSON и получаешь заполненную структуру. Сложности возникают, когда приходит сообщение другого типа (например было типа group, стало private ) или несколько сообщений разных типов. Как в таком случае "парсить" JSON
. На ум приходит только в разных кейсах проверять первые сообщения на отдельный тип, если совпало, сохранять сообщение в общую структуру для всех сообщений "message" и удалять его из "сырой" строки и так по кругу, пока строка не будет пустой. Но это какие-то костыли получаются. Может у кого-то есть идеи, как сделать проще и красивее это дело.

Дорогу осилит идущий.
-
IvanLis
- guru

- Сообщения: 5667
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 35 раз
- Поблагодарили: 124 раза
Re: Разбор JSON
Народ ленивый, нужно взять готовое и что бы из коробочки работалоladik писал(а):На ум приходит только в разных кейсах проверять первые сообщения на отдельный тип, если совпало, сохранять сообщение в общую структуру для всех сообщений "message" и удалять его из "сырой" строки и так по кругу, пока строка не будет пустой. Но это какие-то костыли получаются. Может у кого-то есть идеи, как сделать проще и красивее это дело.![]()
Пути
1. Можно просто поиском искать необходимый фрагмент текста, например "type": "private" и т.д., что позволит определить класс пакета и подать нужный TypeDef.
2. Можно сделать перебором. Например подали первый TypeDef, возникла ошибка.... пробуем следующий. И т.д. до победы.
3. В конце концов, можно самому разобрать пакет используя регулярные выражения.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение Картинку или Файл
Как добавить в сообщение Видео
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение Картинку или Файл
Как добавить в сообщение Видео
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
Pavel Krivozubov
- professor

- Сообщения: 4413
- Зарегистрирован: 07 фев 2008, 16:39
- Награды: 3
- Версия LabVIEW: 7.0 - 2013
- Откуда: г. Электросталь
- Благодарил (а): 31 раз
- Поблагодарили: 10 раз
- Контактная информация:
Re: Разбор JSON
Вадим, а ты спрашивал на нашем канале Telegram про это?
Правила форума
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
-
ladik
- developer

- Сообщения: 277
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Разбор JSON
Спасибо, что-то похожее я примерно и предполагал.Пути
1. Можно просто поиском искать необходимый фрагмент текста, например "type": "private" и т.д., что позволит определить класс пакета и подать нужный TypeDef.
2. Можно сделать перебором. Например подали первый TypeDef, возникла ошибка.... пробуем следующий. И т.д. до победы.
3. В конце концов, можно самому разобрать пакет используя регулярные выражения.
Дорогу осилит идущий.
-
AlexanderKonoval
- 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

- Сообщения: 277
- Зарегистрирован: 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). Так как в данном случае сообщения различаются несильно, такой подход работает.
Дорогу осилит идущий.
-
Andrey Petrzhik
- user

- Сообщения: 88
- Зарегистрирован: 17 ноя 2015, 11:57
- Версия LabVIEW: 12
- Благодарил (а): 4 раза
- Контактная информация:
Re: Разбор JSON
Привет. Чтобы не плодить темы... подскажите правильно ли я JSON передаю? Мне надо POST запрос сделать, чтобы токен получить, но что-то не прокатывает... не Labview методами токен получаю. Кажется что-то с форматом данных. Спасибо за ликбез!
-
Andrey Petrzhik
- user

- Сообщения: 88
- Зарегистрирован: 17 ноя 2015, 11:57
- Версия LabVIEW: 12
- Благодарил (а): 4 раза
- Контактная информация:
-
IvanLis
- guru

- Сообщения: 5667
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 35 раз
- Поблагодарили: 124 раза
Re: Разбор JSON
JSON это как-то так должно быть:Andrey Petrzhik писал(а): 21 янв 2026, 13:41 Привет. Чтобы не плодить темы... подскажите правильно ли я JSON передаю?
Строку какую отправляете, можете показать.Andrey Petrzhik писал(а): 21 янв 2026, 13:41 Мне надо POST запрос сделать, чтобы токен получить, но что-то не прокатывает... не Labview методами токен получаю
Судя по последнему сообщению, там не JSON, а другой API.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение Картинку или Файл
Как добавить в сообщение Видео
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение Картинку или Файл
Как добавить в сообщение Видео
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
Andrey Petrzhik
- user

- Сообщения: 88
- Зарегистрирован: 17 ноя 2015, 11:57
- Версия LabVIEW: 12
- Благодарил (а): 4 раза
- Контактная информация:
Re: Разбор JSON
Вот так в мануале предполагается слать, но оказалось что под labview 12 нет JSON преобразователя данных штатного... пришлось как в curl запросе передавать.
Потом ещё UTF8 поддержки вроде как нет, не получается читать отчёты с русскими буквами, одно расстройство:( Но принципиально тем не менее всё работает.
Потом ещё UTF8 поддержки вроде как нет, не получается читать отчёты с русскими буквами, одно расстройство:( Но принципиально тем не менее всё работает.
- Вложения
-
- POST_API.vi
- (15.54 КБ) 5 скачиваний
-
IvanLis
- guru

- Сообщения: 5667
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 35 раз
- Поблагодарили: 124 раза
Re: Разбор JSON
Установите через VIPM -> JKI JSON Serialization
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение Картинку или Файл
Как добавить в сообщение Видео
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение Картинку или Файл
Как добавить в сообщение Видео
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
Andrey Petrzhik
- user

- Сообщения: 88
- Зарегистрирован: 17 ноя 2015, 11:57
- Версия LabVIEW: 12
- Благодарил (а): 4 раза
- Контактная информация:
-
IvanLis
- guru

- Сообщения: 5667
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 35 раз
- Поблагодарили: 124 раза
Re: Разбор JSON
У Вас VIPM не настроен, как минимум нужно версию указать правильно... и проверить connect с LabVIEW По идее версия 1.1.3.28 должна поддерживатьсяAndrey Petrzhik писал(а): 21 янв 2026, 19:32 Не ставится на 12й LV вроде... видимо давно пора переходить на новую версию...
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение Картинку или Файл
Как добавить в сообщение Видео
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение Картинку или Файл
Как добавить в сообщение Видео
Конвертация / версий (форматов) VI
Как правильно задать вопрос...