cJSON: Формат полей для вложенных структур
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
cJSON: Формат полей для вложенных структур
У меня на тесте и реальных данных теперь проблемы нет.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
cJSON: Формат полей для вложенных структур
Игорь, а какую задачу решаете, если не секрет? Вдруг тоже надо.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
cJSON: Формат полей для вложенных структур
А задача моя слишком известная, что бы её вслух называть ! (С) Иван Васильевич
Я же спрашивал про подключение к ЭДО Контур.Диадок. Никто не делал, вот и сижу сам пилю потихоньку.
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
cJSON: Формат полей для вложенных структур
Если позволите, вопрос из регионов по реальной работе с вложенными списками.
Для загрузки структуры с вложенными списками существует логичный и красивый метод.
Всё в одном месте, видно и понятно даже для тех, кто из Ростова:
Но при выгрузке той же самой структуры начинается странная многоходовочка:
1. Мы должны в объявить в строго заданном месте группы переменную qInstanse после &списка;
(найди её потом через 20 экранов в отдельном INC файле)
2. При формировании каждого списка присвоить этой переменной значение Instance(qPhones,Thread());
(за несколько экранов кода до выгрузки)
3. И ещё при выгрузке не забыть отдельно пнуть что: [{"name":"Phones","isQueue":true}].
Но ведь если сделать симметричный метод - то всё логично и красиво можно выгрузить в одном месте:
Всё, что нужно есть: передача адреса списка в "instance" подразумевает, что поле Phones это указатель на список.
Прошу посмотреть на ситуацию в контексте работы с большим объёмом данных. Спасибо ...
Для загрузки структуры с вложенными списками существует логичный и красивый метод.
Всё в одном месте, видно и понятно даже для тех, кто из Ростова:
Код: Выделить всё
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()) &'}]'')
Прошу посмотреть на ситуацию в контексте работы с большим объёмом данных. Спасибо ...
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
cJSON: Формат полей для вложенных структур
IsQueue и отдельное поле для Instance - это всё для случая очередей в очередях. Скажем, список людей, и для каждого свой список телефонов. Тут одним Instance на всех не обойдёшься, приходится вводить поле Instance для каждой внутренней очереди.
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
cJSON: Формат полей для вложенных структур
1. Очередь в очереди - это очень непрактичная структура в БД.
Обычно всё-таки общий список телефонов с привязкой по ID к записи владельца.
Я универсальный метод для такой загрузки (!) уже реализовал сам, поэтому молчу на эту тему ...
С выгрузкой пока не сталкивался - но идея там будет таже самая ...
2. Возможность задавать для выгрузки параметр "Instance" не требует отмены (совместим) с IsQueue.
Просто при разборе параметров наличие значения в "Instance" устанавливает флаг IsQueue и
вместо следующего поля берёт адрес очереди из списка парметров по имени поля (что проще) ...
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
cJSON: Формат полей для вложенных структур
Действительно, опция "Instance" работает только в ToGroup, это я упустил, добавлю в CreateObject сегодня попозже.
С уважением, ДП
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
cJSON: Формат полей для вложенных структур
Добавил, проверяйте.
Код: Выделить всё
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.clw
- (76.79 КБ) 21 скачивание
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
cJSON: Формат полей для вложенных структур
Проверил с пристрастием - на моих данных всё работает отлично !
Если позволите вопрос. Существут ли механизм для вставки готовых фрагментов при выгрузке JSON структуры ?
Поясню. При составлении запроса на передачу данных - нужно для каждого файла (Queue) передавать много
мелких параметров, которые оформляются как отделные микро-списки. Например:
Решение понятно. Для каждой записи списка документов добавляется несколько вложенных списков.
Они привязываются к указателям + Instance и заполняются данными. Список документов выгружается,
потом для каждой записи зачищаются все вложенные очереди. Катастрофически громозкий объём кода !
Здесь бы хорошо работал механизм как у Вас сделаны параметры Options в методах json::CreateObject() и т.д.
Т.е. обявлять такие микро-списки просто как строки и записывать в них уже готовую JSON строку.
Но тогда нужно, что бы у такого поля был особый режим выгрузки "IsStrRaw" - иначе она берётся в кавычки и экранируется.
Или можно как-то упростить работу с мелкими списками по другому ? Заранее спасибо !
Если позволите вопрос. Существут ли механизм для вставки готовых фрагментов при выгрузке 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
Или можно как-то упростить работу с мелкими списками по другому ? Заранее спасибо !
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
cJSON: Формат полей для вложенных структур
Да легко! Правда, не тестировал: новая опция "IsRaw".
- Вложения
-
- cjson.clw
- (76.96 КБ) 21 скачивание
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
cJSON: Формат полей для вложенных структур
Всё работает ! Сегодня просто праздник какой-то !
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
cJSON: Формат полей для вложенных структур
Пока не буду обновлять github, чувствую ещё ничего не закончилось
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
cJSON: Формат полей для вложенных структур
Я сейчас один умный вещь скажу, Вы только не обижайтесь ... (С) Мимино
Каждый, кто пойдёт в реальной работе дальше чем "группа + список" - увидит тоже, что и я ...
Каждый, кто пойдёт в реальной работе дальше чем "группа + список" - увидит тоже, что и я ...
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
cJSON: Формат полей для вложенных структур
Если можно чего-то хотеть, то я бы попросил рассмотреть опцию для работу с файлами для json::CreateObject().
Т.е. мы указываем в строке полное имя файла, включаем для неё {"IsFile":True} и в тег записывается
содержимое файла в BASE64. Всё. Это направление сейчас вообще никак не представлено в классе.
Существующий инструмент позволяет решать задачу только многоходовой комбинацией
через динамические строки (+ буфер) и свернуть её я не могу (можно только внутри класса):
Спасибо !
Т.е. мы указываем в строке полное имя файла, включаем для неё {"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).
Последний раз редактировалось Игорь Столяров 24 Ноябрь 2022, 19:03, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс