Страница 3 из 18
cJSON: Формат полей для вложенных структур
Добавлено: 22 Ноябрь 2022, 20:02
Игорь Столяров
У меня на тесте и реальных данных теперь проблемы нет.

cJSON: Формат полей для вложенных структур
Добавлено: 22 Ноябрь 2022, 20:38
Дед Пахом
Выложил на github.
cJSON: Формат полей для вложенных структур
Добавлено: 22 Ноябрь 2022, 22:29
finsoftrz
Игорь, а какую задачу решаете, если не секрет? Вдруг тоже надо.

cJSON: Формат полей для вложенных структур
Добавлено: 22 Ноябрь 2022, 22:40
Игорь Столяров
finsoftrz писал(а): 22 Ноябрь 2022, 22:29
Игорь, а какую задачу решаете, если не секрет
А задача моя слишком известная, что бы её вслух называть ! (С) Иван Васильевич
Я же спрашивал про подключение к ЭДО Контур.Диадок. Никто не делал, вот и сижу сам пилю потихоньку.

cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 9:23
Игорь Столяров
Если позволите, вопрос из регионов по реальной работе с вложенными списками.
Для загрузки структуры с вложенными списками существует логичный и красивый метод.
Всё в одном месте, видно и понятно даже для тех, кто из Ростова:
Код: Выделить всё
Parser.ToGroup(TestString, gPerson,,'[{{"name":"Phones", "instance":'& Instance(qPhones,Thread()) &'}]')
Но при выгрузке той же самой структуры начинается странная многоходовочка:
1. Мы должны в объявить в строго заданном месте группы переменную qInstanse после &списка;
(найди её потом через 20 экранов в отдельном INC файле)
2. При формировании каждого списка присвоить этой переменной значение Instance(qPhones,Thread());
(за несколько экранов кода до выгрузки)
3. И ещё при выгрузке не забыть отдельно пнуть что: [{"name":"Phones","isQueue":true}].
Но ведь если сделать симметричный метод - то всё логично и красиво можно выгрузить в одном месте:
Код: Выделить всё
Params &= json::CreateObject(gPerson,,'[{{"name":"Phones", "instance":'& Instance(qPhones,Thread()) &'}]'')
Всё, что нужно есть: передача адреса списка в "instance" подразумевает, что поле Phones это указатель на список.
Прошу посмотреть на ситуацию в контексте работы с большим объёмом данных. Спасибо ...

cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 11:28
Дед Пахом
IsQueue и отдельное поле для Instance - это всё для случая очередей в очередях. Скажем, список людей, и для каждого свой список телефонов. Тут одним Instance на всех не обойдёшься, приходится вводить поле Instance для каждой внутренней очереди.
cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 11:41
Игорь Столяров
Дед Пахом писал(а): 23 Ноябрь 2022, 11:28
приходится вводить поле Instance для каждой внутренней очереди
1. Очередь в очереди - это очень непрактичная структура в БД.
Обычно всё-таки общий список телефонов с привязкой по ID к записи владельца.
Я универсальный метод для такой загрузки (!) уже реализовал сам, поэтому молчу на эту тему ...

С выгрузкой пока не сталкивался - но идея там будет таже самая ...
2. Возможность задавать для выгрузки параметр "Instance" не требует отмены (совместим) с IsQueue.
Просто при разборе параметров наличие значения в "Instance" устанавливает флаг IsQueue и
вместо следующего поля берёт адрес очереди из списка парметров по имени поля (что проще) ...
cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 11:48
Дед Пахом
Действительно, опция "Instance" работает только в ToGroup, это я упустил, добавлю в CreateObject сегодня попозже.
cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 15:55
Дед Пахом
Добавил, проверяйте.
Код: Выделить всё
jPerson &= json::CreateObject(PersonGrp,, '[{{"name":"Phones", "instance":'& Phones::Inst &'},{{"name":"Addresses", "instance":'& Addr::Inst &'}]')
IF NOT jPerson &= NULL
printd(jPerson.ToString(TRUE))
jPerson.Delete()
END
cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 20:05
Игорь Столяров
Проверил с пристрастием - на моих данных всё работает отлично !
Если позволите вопрос. Существут ли механизм для вставки готовых фрагментов при выгрузке JSON структуры ?
Поясню. При составлении запроса на передачу данных - нужно для каждого файла (Queue) передавать много
мелких параметров, которые оформляются как отделные микро-списки. Например:
Код: Выделить всё
metadata &QueueTypeMetaData
"metadata": [
{"key": "FileName","value": "shet.docx"},
{"key": "DocumentNumber","value": "12345"},
{"key": "DocumentDate","value": "2022-11-23T19:22:49Z"},
{"key": "TotalSum","value": "137.98"}]
Решение понятно. Для каждой записи списка документов добавляется несколько вложенных списков.
Они привязываются к указателям + Instance и заполняются данными. Список документов выгружается,
потом для каждой записи зачищаются все вложенные очереди. Катастрофически громозкий объём кода !
Здесь бы хорошо работал механизм как у Вас сделаны параметры Options в методах json::CreateObject() и т.д.
Т.е. обявлять такие микро-списки просто как строки и записывать в них уже готовую JSON строку.
Код: Выделить всё
Files Queue
...
metadata CString('[{"key": "FileName","value": "shet.docx"},{"key": "DocumentNumber","value": "12345"} ...]')
end
Но тогда нужно, что бы у такого поля был особый режим выгрузки "IsStrRaw" - иначе она берётся в кавычки и экранируется.
Или можно как-то упростить работу с мелкими списками по другому ? Заранее спасибо !

cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 20:25
Дед Пахом
Да легко! Правда, не тестировал: новая опция "IsRaw".
cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 21:50
Игорь Столяров
Всё работает !

Сегодня просто праздник какой-то !

cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 22:14
Дед Пахом
Пока не буду обновлять github, чувствую ещё ничего не закончилось

cJSON: Формат полей для вложенных структур
Добавлено: 23 Ноябрь 2022, 23:05
Игорь Столяров
Я сейчас один умный вещь скажу, Вы только не обижайтесь ... (С) Мимино
Каждый, кто пойдёт в реальной работе дальше чем "группа + список" - увидит тоже, что и я ...

cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 8:58
Игорь Столяров
Если можно чего-то хотеть, то я бы попросил рассмотреть опцию для работу с файлами для json::CreateObject().
Т.е. мы указываем в строке полное имя файла, включаем для неё {"IsFile":True} и в тег записывается
содержимое файла в BASE64. Всё. Это направление сейчас вообще никак не представлено в классе.
Существующий инструмент позволяет решать задачу только многоходовой комбинацией
через динамические строки (+ буфер) и свернуть её я не могу (можно только внутри класса):
Код: Выделить всё
xFileContent &String
xBuffer &IDynStr
Code
...
! В цикле для каждой записи списка
xFileContent &= json::LoadFile(qDocument.FullName)
If ~(xFileContent &= Null)
xBuffer.Kill
xBuffer.Cat(ToBase64(xFileContent)) ! Содержимое файла в BASE64 без конвертации (AsIs)
qDocument.Content &= New(String(xBuffer.StrLen())) ! Тег в списке для выгрузки в JSON
xBuffer.CopyTo(qDocument.Content)
Dispose(xFileContent)
end
...
Params &= json::CreateObject(gMessageToPost,,[{{"name":"Content","IsStringRef":true}]')
...
! В цикле для каждой записи списка
If ~(qDocument.Content &= Null) then Dispose(qDocument.Content).
Спасибо !
