Разбор JSON

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

Silver
developer
developer
Сообщения: 277
Зарегистрирован: 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 КБ) 6630 просмотров
Сложности возникают, когда приходит сообщение другого типа (например было типа group, стало private ) или несколько сообщений разных типов. Как в таком случае "парсить" JSON :dntknw:.
JSON Messages.png
На ум приходит только в разных кейсах проверять первые сообщения на отдельный тип, если совпало, сохранять сообщение в общую структуру для всех сообщений "message" и удалять его из "сырой" строки и так по кругу, пока строка не будет пустой. Но это какие-то костыли получаются. Может у кого-то есть идеи, как сделать проще и красивее это дело. :bye: :thank:
Дорогу осилит идущий.
Аватара пользователя
IvanLis

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

Re: Разбор JSON

Сообщение IvanLis »

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

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

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

Re: Разбор JSON

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

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

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

Re: Разбор JSON

Сообщение ladik »

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

Silver
developer
developer
Сообщения: 277
Зарегистрирован: 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
Сообщения: 277
Зарегистрирован: 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
Дорогу осилит идущий.
Andrey Petrzhik
user
user
Сообщения: 88
Зарегистрирован: 17 ноя 2015, 11:57
Версия LabVIEW: 12
Благодарил (а): 4 раза
Контактная информация:

Re: Разбор JSON

Сообщение Andrey Petrzhik »

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

Re: Разбор JSON

Сообщение Andrey Petrzhik »

Отбой, видимо не так перегоняю json, но и костыль пойдёт
Вложения
Clipboard 5.png
Аватара пользователя
IvanLis

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

Re: Разбор JSON

Сообщение IvanLis »

Andrey Petrzhik писал(а): 21 янв 2026, 13:41 Привет. Чтобы не плодить темы... подскажите правильно ли я JSON передаю?
JSON это как-то так должно быть:
Снимок экрана от 2026-01-21 16-19-35.png
Andrey Petrzhik писал(а): 21 янв 2026, 13:41 Мне надо POST запрос сделать, чтобы токен получить, но что-то не прокатывает... не Labview методами токен получаю
Строку какую отправляете, можете показать.
Судя по последнему сообщению, там не JSON, а другой API.
Andrey Petrzhik
user
user
Сообщения: 88
Зарегистрирован: 17 ноя 2015, 11:57
Версия LabVIEW: 12
Благодарил (а): 4 раза
Контактная информация:

Re: Разбор JSON

Сообщение Andrey Petrzhik »

Вот так в мануале предполагается слать, но оказалось что под labview 12 нет JSON преобразователя данных штатного... пришлось как в curl запросе передавать.
Потом ещё UTF8 поддержки вроде как нет, не получается читать отчёты с русскими буквами, одно расстройство:(
Clipboard 2.png
Clipboard 6.png
Но принципиально тем не менее всё работает.
Вложения
POST_API.vi
(15.54 КБ) 5 скачиваний
Аватара пользователя
IvanLis

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

Re: Разбор JSON

Сообщение IvanLis »

Andrey Petrzhik писал(а): 21 янв 2026, 18:05 labview 12 нет JSON преобразователя данных штатного
Установите через VIPM -> JKI JSON Serialization
Andrey Petrzhik
user
user
Сообщения: 88
Зарегистрирован: 17 ноя 2015, 11:57
Версия LabVIEW: 12
Благодарил (а): 4 раза
Контактная информация:

Re: Разбор JSON

Сообщение Andrey Petrzhik »

Не ставится на 12й LV вроде... видимо давно пора переходить на новую версию...
Вложения
Clipboard 4.png
Аватара пользователя
IvanLis

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

Re: Разбор JSON

Сообщение IvanLis »

Andrey Petrzhik писал(а): 21 янв 2026, 19:32 Не ставится на 12й LV вроде... видимо давно пора переходить на новую версию...
У Вас VIPM не настроен, как минимум нужно версию указать правильно... и проверить connect с LabVIEW
Clipboard 4.png
По идее версия 1.1.3.28 должна поддерживаться
Ответить

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