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

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

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

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

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

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

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

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

Выложил на github.
С уважением, ДП
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4560
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Игорь, а какую задачу решаете, если не секрет? Вдруг тоже надо. :-)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

finsoftrz писал(а): 22 Ноябрь 2022, 22:29 Игорь, а какую задачу решаете, если не секрет
А задача моя слишком известная, что бы её вслух называть ! (С) Иван Васильевич
Я же спрашивал про подключение к ЭДО Контур.Диадок. Никто не делал, вот и сижу сам пилю потихоньку. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Если позволите, вопрос из регионов по реальной работе с вложенными списками.

Для загрузки структуры с вложенными списками существует логичный и красивый метод.
Всё в одном месте, видно и понятно даже для тех, кто из Ростова:

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

  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 это указатель на список.
Прошу посмотреть на ситуацию в контексте работы с большим объёмом данных. Спасибо ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

IsQueue и отдельное поле для Instance - это всё для случая очередей в очередях. Скажем, список людей, и для каждого свой список телефонов. Тут одним Instance на всех не обойдёшься, приходится вводить поле Instance для каждой внутренней очереди.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

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

2. Возможность задавать для выгрузки параметр "Instance" не требует отмены (совместим) с IsQueue.
Просто при разборе параметров наличие значения в "Instance" устанавливает флаг IsQueue и
вместо следующего поля берёт адрес очереди из списка парметров по имени поля (что проще) ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

Действительно, опция "Instance" работает только в ToGroup, это я упустил, добавлю в CreateObject сегодня попозже.
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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 КБ) 19 скачиваний
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Проверил с пристрастием - на моих данных всё работает отлично ! :ty:

Если позволите вопрос. Существут ли механизм для вставки готовых фрагментов при выгрузке 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" - иначе она берётся в кавычки и экранируется.
Или можно как-то упростить работу с мелкими списками по другому ? Заранее спасибо ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

Да легко! Правда, не тестировал: новая опция "IsRaw".
Вложения
cjson.clw
(76.96 КБ) 20 скачиваний
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Всё работает ! :ty: Сегодня просто праздник какой-то ! :D
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

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

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

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

Я сейчас один умный вещь скажу, Вы только не обижайтесь ... (С) Мимино
Каждый, кто пойдёт в реальной работе дальше чем "группа + список" - увидит тоже, что и я ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Если можно чего-то хотеть, то я бы попросил рассмотреть опцию для работу с файлами для 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).  
Спасибо ! :D
Последний раз редактировалось Игорь Столяров 24 Ноябрь 2022, 19:03, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Закрыто