cJSON: Формат полей для вложенных структур

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 6409
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 4 раза
Поблагодарили: 14 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Переговоры ! :)
При включении опции "EmptyString" = "ignore" не выгружаются теги у которых значение пустая строка. Ok !
Но выгружаются теги, у которых значение - ноль. А хотелось бы выгружать только теги несущие информацию.
Иначе вот так (3000 записей в пакете):

Код: Выделить всё

{
    "File": 1,
    "Item": 1,
    "Long_01": 0,
    "Long_02": 2335,
    "Long_03": 81052,
    "Long_04": 81054,
    "Long_05": 81054,
    "Long_06": 7314232,
    "Long_07": 7,
    "Long_08": 0,
    "Long_09": 0,
    "Long_10": 0,
    "Long_11": 0,
    "Long_12": 1,
    "Long_13": 0,
    "Long_14": 0,
    "Long_15": 0,
    "Long_16": 0,
    "Long_17": 0,
    "Long_18": 0,
    "Long_19": 0,
    "Long_20": 0,
    "Long_21": 0,
    "Long_22": 0,
    "Long_23": 0,
    "Long_24": 0,
    "Long_25": 0,
    "Long_26": 0,
    "Long_27": 0,
    "Long_28": 0,
    "Long_29": 0,
    "Long_30": 0,
    "Long_31": 0,
    "Long_32": 0,
    "Long_33": 0,
    "Long_34": 0,
    "Long_35": 0,
    "Long_36": 0,
    "Long_37": 0,
    "Long_38": 0,
    "Long_39": 0,
    "Long_40": 0,
    "Long_41": 0,
    "Long_42": 0,
    "Long_43": 0,
    "Long_44": 0,
    "Real_01": 0,
    "Real_02": 0,
    "Real_03": 0,
    "Real_04": 0,
    "Real_05": 0,
    "Real_06": 0,
    "Real_07": 0,
    "Real_08": 0,
    "Real_09": 0,
    "Real_10": 0,
    "Real_11": 0,
    "Real_12": 0,
    "Real_13": 0,
    "Real_14": 0,
    "Real_15": 0,
    "Real_16": 0,
    "Real_17": 0,
    "Real_18": 0,
    "Real_19": 0,
    "Real_20": 0,
    "Byte_01": 0,
    "Byte_02": 0,
    "Byte_03": 4,
    "Byte_04": 1,
    "Byte_05": 0,
    "Byte_06": 0,
    "Byte_07": 0,
    "Byte_08": 0,
    "Byte_09": 1,
    "Byte_10": 3,
    "Byte_11": 2,
    "Byte_12": 1,
    "Byte_13": 0,
    "Byte_14": 0,
    "Byte_15": 0,
    "Byte_16": 0,
    "Byte_17": 0,
    "Byte_18": 0,
    "Byte_19": 0,
    "Byte_20": 0,
    "Byte_21": 0,
    "Byte_22": 0,
    "Byte_23": 0,
    "Byte_24": 0,
    "Byte_25": 0,
    "Byte_26": 0,
    "Byte_27": 0,
    "Byte_28": 0,
    "Byte_29": 0,
    "Byte_30": 0,
    "Byte_31": 0,
    "Byte_32": 0,
    "Byte_33": 0,
    "Byte_34": 0,
    "Byte_35": 0,
    "Byte_36": 0,
    "Byte_37": 0,
    "Byte_38": 0,
    "Byte_39": 0,
    "Byte_40": 0,
    "Byte_41": 0,
    "Byte_42": 0,
    "Byte_43": 0,
    "Byte_44": 0,
    "String40_01": "ОБЩИЙ",
    "String40_02": "77A61D59-595B-4B79-9F48-EF30AAAD2B76",
    "String40_03": "sosiski@prosrochka.net",
    "String40_04": "26.11.2022",
    "String40_05": "28.11.2022",
    "String40_06": "28.11.2022",
    "String40_07": "20:19:02"
  },
Приносим Вам свои неудобства !
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2977
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 1 раз
Поблагодарили: 13 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

Ну так это же не строки, а числа.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 6409
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 4 раза
Поблагодарили: 14 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Абсолютно верно.
Но при загрузке ноль - это значение цифрового тега по умолчанию.
Точно также как и пустая строка для символьного тега.

Эти пустой и нулевой теги не несут информации - и их не надо записывать в JSON пакет (опционально).
Запись пустого тега сейчас можно отключить {"Name":"*","EmptyString":"ignore"}, а нулевого - нет. :(
Приносим Вам свои неудобства !
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2977
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 1 раз
Поблагодарили: 13 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

Опция "IgnoreZero":true не создаёт элементы типа "item":0. Можно указать для всех полей сразу.
Опция "IgnoreFalse":true не создаёт элементы типа "item":false. Надо указывать для каждого bool-поля вместе с опцией "isBool":true.

Применяется только в json::CreateObject(group...)
Вложения
cjson.clw
(82.87 КБ) 15 скачиваний
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 6409
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 4 раза
Поблагодарили: 14 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Всё абсолютно логично и понятно. :ty:
Размер пакета сразу упал с 4 MByte до 500 KByte. :)

Формат Json удобен для обмена данными внутри / между программы.
Например есть универсальная структура в которую записывается документ сохраняется в ClipBoard.
А при вставке - из строки берутся только нужные данные для добавляемого вида документа.
Но при таком обмене и конвертации документов 90% тегов - пустые или нулевые ...
Приносим Вам свои неудобства !
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 6409
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 4 раза
Поблагодарили: 14 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Интересная (но совсем не очевидная !) комбинация для загрузки именованных массивов:

Код: Выделить всё

Class.MyTest  Procedure()
Root        &cJson
Json        cJSONFactory
gResponse   Group
suggestions   &Queue  ! Тип поля не имеет значения (просто обозначил, что здесь некий список)
            end
qDimensions Queue
Name          String(20)
Size          String(20)
            end
jStr        String('{{"suggestions":[{{"Инга":"90-65-90"},{{"Снежана":"95-60-80"},{{"Виктория":"90-60-90"}]}')
 Code   
 Root &= Json.Parse(jStr)
 If Not (Root &= Null)
    Root.ToGroup(gResponse,,'[{{"name":"suggestions","instance":' & Instance(qDimensions,Thread()) & '}]')
    Root.Delete()
 end
 Message(Records(qDimensions))  ! = 3
Приносим Вам свои неудобства !
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2977
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 1 раз
Поблагодарили: 13 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

Игорь Столяров писал(а): 01 Декабрь 2022, 10:02 jStr String('{{"suggestions":[{{"Инга":"90-65-90"},{{"Снежана":"95-60-80"},{{"Виктория":"90-60-90"}]}')
А можно всех посмотреть?
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 4609
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 3 раза

cJSON: Формат полей для вложенных структур

Сообщение kreator »

Автоматизация низкого уровня социальной ответственности? :D
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 3636
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 2 раза
Поблагодарили: 5 раз

cJSON: Формат полей для вложенных структур

Сообщение finsoftrz »

Игорь Столяров писал(а): 28 Ноябрь 2022, 22:57 Всё абсолютно логично и понятно. :ty:
Размер пакета сразу упал с 4 MByte до 500 KByte. :)

Формат Json удобен для обмена данными внутри / между программы.
Например есть универсальная структура в которую записывается документ сохраняется в ClipBoard.
А при вставке - из строки берутся только нужные данные для добавляемого вида документа.
Но при таком обмене и конвертации документов 90% тегов - пустые или нулевые ...
Пример не понятен. Если речь про типовой функционал ввода документов на основании, то clipboard смысла нет использовать.
Я, к слову, когда увидел эту тему, поинтересовался, как другие с json работают. Оказалось, что в с#, где стандарт у МС это xml, народ вышел из положения, делая конвертор из json в xml, а дальше как обычно, стандартными средствами работы с xml. Этот конвертор строк 30 текста.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 6409
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 4 раза
Поблагодарили: 14 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

finsoftrz писал(а): 01 Декабрь 2022, 16:08 стандартными средствами работы с xml
Тут в каждой деревне свои законы. У того же Google - это ProtoBuf. Они говорят - а нам так удобно. :shock:
Нам (со средой разработки не интересной производителям инструментальных средств) - важно наличии реализации.
Штатные, что XML, что JSON классы - очень устарели, и морально и технологически. Не обновлялись лет 10-15. :(

Например я заходил на обмен с Контур.Диадок 3 года назад. Не сделал только из-за невозможности разбора
навороченных структур JSON. Сейчас такой инструмент есть. Видел конверторы JSON <-> XML, не бесплатные.
Но в Clarion и работа со штатным XML классом тоже не очень весёлая и бодрая. :(
Приносим Вам свои неудобства !
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 6409
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 4 раза
Поблагодарили: 14 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

finsoftrz писал(а): 01 Декабрь 2022, 16:08 Я, к слову, когда увидел эту тему, поинтересовался, как другие с json работают
Здесь есть ещё один момент.
Это обмен данными с оборудованием. Например в том же драйвере АТОЛ 10 все запросы сведений
о чеках из фискального накопителя (ФН) уже переведена на обмен через JSON. И без вариантов. :(

И как я понимаю, вектор развития драйвера АТОЛ 10 - это полный переход на обмен в формате JSON.
Тогда будет платформо-независимая работа, всё равно где сформирован чек: в программе, сервисе, приложении ...
У производителей поменьше это уже есть, но они не тянут за собой совместимость огромного парка оборудования и софта ...
Приносим Вам свои неудобства !
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 3636
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 2 раза
Поблагодарили: 5 раз

cJSON: Формат полей для вложенных структур

Сообщение finsoftrz »

Конверторы с json в xml вроде как каждый не ленивый пишет на с#. Если гугл не врет. :-)
На xml много чего - егаис, ветис, вся налоговая отчётность, обмен с эдо, работа с ккм сп и т.д.
Штатный xml парсер в кларионе совсем не весело, так как не поддерживает работу с пространством имён. Поэтому я использую vbscript.
Json это вебовская штука, которая, как я понимаю, была разработана для обмена данными, чтобы упростить и не тащить все навороты xml и не плыть в форватере мс. Поэтому некоторые создатели всякой чепухи начали принимать его за стандарт в своих системах.
Судя по всему, нам придётся поддерживать работу как с xml, так и с json. Ещё и с csv. Надеюсь, этот список не будет расширяться. А json не станет таким сложным, как xml.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 6409
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 4 раза
Поблагодарили: 14 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

В XML есть навороченные средства валидации содержания (XSD).
Причём их настолько навернули - что уже мало кто в них что либо понимает, генерят XML-Spy и всё. :)

Конечно было бы круто, что бы отцы-основатели между собой перетёрли и выбрали один формат обмена данными.
Что бы прикладным программерам не делать несколько реализаций их "а я художник, я так вижу". Но это мечты ... :dizzy:
Приносим Вам свои неудобства !
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 6409
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 4 раза
Поблагодарили: 14 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Привет всем !
Поднакопился опыт работы с классом - если позволите, вынесу на обсуждение свои мечталки и хотелки.
Ничего проблемного или революционного нет, но можно сделать жись немного светлее. Итак ! :)

1. Проверка и выдача сообщений при ошибке разбора параметра Options везде.
Стали делать достаточно сложные и динамически формируемые параметры управления выгрузкой / загрузкой
JSON и бывает непонятно почему всё не работает. Потом находишь пропущенную запятую или скобку в строке ... :(
Простое правило: если при вызове метода есть параметр Options и его не удалось распарсить - сообщите пжалуйста явно об этом ! :)

2. Стыковка класса CJSON с LibCurl. Сейчас полученный с сервиса ответ в IDynStr передаётся на распарс через строку: IDynStr.ToStr()
Почему бы не сделать версии методов ToObject / ToQueue / ToGroup с передачей результата по адресу в штатном &IDynStr ?

3. Достаточно большой объём кода по очистке динамически выделяемой памяти на тегах с параметрами "IsStringRef".
Можно ведь вести в классе внутренний Queue со списком всех адресов выделеной памяти для тегов с "IsStringRef" ?
И добавить метод KillAllNew() который пробежит по этому Queue, проверит для записей на Not(&= Null) и выполнит Dispose() ?
А ещё лучше сразу добавить вызов этого метода в Destruct(), что бы вообще об этом больше не думать. :)

4. Апну тему с обменом файлами. Опция "IsFile=True" для тега. Приходится писать одну и ту же циклическую обработку по кругу :(
- Для CreateObject() / CreateArray(). В теге имя файла -> записываем в JSON-тег содержимое файла в ToBASE64. Очень по джисановски !
- Для ToObject / ToQueue / ToGroup. В теге указатель на &String. Cоздаём строку с бинарным содержимым из тега FromBASE64.
(и здесь бы тоже хорошо сразу применить для созданной строки правило из п.3.)

Сразу хочу сказать, что изложил свои мысли в том виде как они у меня появились голове, т.е. никого обидеть не хотел !
Я - художник, я так вижу ... ;) За прочтение, обсуждение и рассмотрение: :ty:
Приносим Вам свои неудобства !
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2977
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 1 раз
Поблагодарили: 13 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

1. Сообщение об ошибке выводится в DebugLog. Если хотите что-то типа MESSAGE, то Options это тоже json, вызовите parser.Parse(Options) и обработайте ошибку.
2. Это можно.
3. Кто делал NEW, тот и должен делать DISPOSE.
4. Надо подумать.
С уважением, ДП
Закрыто