Страница 12 из 18

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

Добавлено: 17 Декабрь 2022, 19:18
Дед Пахом
Вышла v1.34.
В примере base64Test.clw последняя процедура "FileFromBase64RuleHelperTest" предлагает способ загрузки динамических данных в поля с правилом "auto".
В качестве документации добавил сводную таблицу правил: имя, тип, описание, где применять.

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

Добавлено: 17 Декабрь 2022, 20:02
Игорь Столяров
Дед Пахом писал(а): 17 Декабрь 2022, 19:18 добавил сводную таблицу правил
Спасибо ! Добрая таблица собралась-то ! :)
Не рассмотрите пополнение коллекции ? ;)

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

Для тегов указателей "IsQueue" / "IsStringRef" хочется иметь возможность указывать
дополнение {"IgnoreNull":true} - т.е. просто не выгружать тег если он не инициализирован (его значение &= Null).

Сейчас выгржается указатель как экранированный UTF16 ... хотя какой смысл вообще в выгрузке тега указателя &= Null ? 
Ну или выгружать его хотя бы как "NameRef": null ... если он &= Null ...
:ty:

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

Добавлено: 17 Декабрь 2022, 20:13
Дед Пахом
Давайте на каждое предложение прикладывать простейший пример с комментарием "сейчас вот так, а хотелось бы вот так".

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

Добавлено: 17 Декабрь 2022, 20:49
Игорь Столяров
Спасибо - я понял ... Это уже сделано.
Указатель &= Null для "IsQueue" / "IsStringRef" выгружается теперь как пустой массив / строка ... а далее уже понятно.
Единственно, что:

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

Root   &cJson
gPack  Group
FB       Byte(123)
Doc1     &Queue
Doc1Inst Long
RefValue &String
       end
  Code 
  Root &= json::CreateObject(gPack)
Сейчас выгружается как

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

{
  "fb": 123,
  "doc1": "\u0000\u0000\u0000\u0000",
  "doc1inst": 0,
  "refvalue": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
}
а должно ли быть ?

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

{
  "fb": 123,
  "doc1": null,
  "doc1inst": 0,
  "refvalue": null
}

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

Добавлено: 17 Декабрь 2022, 22:29
Дед Пахом
Из ANY мало что можно вытянуть законными способами, у нас есть только ISSTRING и ISGROUP. Я сделал некие предположения в процессе анализа содержимого ANY, которые вроде бы помогают определить ситуацию "ссылка равна NULL".

Обновил 1.34, но настоятельно прошу протестировать всё (не только этот пример) тщательно.

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

Добавлено: 17 Декабрь 2022, 23:06
Игорь Столяров
Спасибо. Я всё проверяю на тестах.
Далее применяю решения в рабочих проектах - это конечно требует времени.
Сейчас отрабатываю выгрузку файлов и SimpleArray ...
Дед Пахом писал(а): 17 Декабрь 2022, 22:29 Из ANY мало что можно вытянуть законными способами,
Даже и не думал, что c проверкой ANY на Null могут возникнуть сложности. :(
Определить тип данных - да, там только строка или группа ...

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

Добавлено: 17 Декабрь 2022, 23:23
Дед Пахом
Игорь Столяров писал(а): 17 Декабрь 2022, 23:06 Даже и не думал, что c проверкой ANY на Null могут возникнуть сложности.
Дело не в проверки ANY на NULL (она всегда не-NULL), а в проверке того, на что указывает ANY, на NULL, если это вообще тип-"указатель".

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

Добавлено: 20 Декабрь 2022, 12:03
Игорь Столяров
Дед Пахом писал(а): 14 Декабрь 2022, 15:58 Да, эту возможность надо добавить.
Работает просто шикарно ! :ty:
К классу это уже наверно не имеет отношения, но для себя сделал опцию:
если Queue состоит из одного поля - то она всегда выгружается как SimpleArray.
Это просто логическое следствие из функционала класса:
- зачем выгружать наименования тегов, если они потом нигде не используются ? :)

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

Добавлено: 22 Декабрь 2022, 21:12
Игорь Столяров
Добрый день !
Есть небольшой проблем ... Тестовый код в студию:

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

Root   &cJson
gPack  Group
DocTemp  Long,Dim(1)
       end
  Code
  gPack.DocTemp[1] = 123
  Root &= json::CreateObject(gPack)
  Message(Root.ToString())
Ожидание:

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

  {"doctemp": [123]}
Реальность:
1.jpg

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

Добавлено: 22 Декабрь 2022, 21:23
Дед Пахом
Это известная проблема, для решения введено правило "ArraySize":

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

gPack                         Group
DocTemp                         Long,Dim(2)
                              end
  Root &= json::CreateObject(gPack,, '{{"name":"DocTemp","arraysize":1}')

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

Добавлено: 22 Декабрь 2022, 21:37
Игорь Столяров
Заработало ! Теперь это правило известно и мне. :ty:
Я конечно видел "arraysize" в табличке, но воспринял (почему-то) его как ограничение на обрабатываемую размерность массива.

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

Добавлено: 22 Декабрь 2022, 21:44
Дед Пахом
Если HOWMANY возвращает 1, то невозможно понять, то ли это просто поле, то ли массив DIM(1). Так что я считаю, что это просто поле без всяких DIM. Поэтому если встречается DIM(1), то всё встаёт колом.

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

Добавлено: 22 Декабрь 2022, 21:50
Игорь Столяров
Дед Пахом писал(а): 22 Декабрь 2022, 21:44 Если HOWMANY возвращает 1, то невозможно понять, то ли это просто поле, то ли массив DIM(1)
Неоднозначность. :( А зачем тогда объявление DIM(2), если ArraySize уже явно указывает, что поле - это массив DIM (1) ?

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

Добавлено: 22 Декабрь 2022, 21:55
Дед Пахом
Потому что проверка "массив/не массив" идёт по HOWMANY.

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

Добавлено: 22 Декабрь 2022, 22:06
Игорь Столяров
Понял, нет проблем. Это просто место которое нужно знать. :ty: Особенность.
Сразу столкнулся, как начал делать обработку записей в BROWSE (либо список выбранных, либо текущая запись).