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

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

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

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

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

Вопрос по работе с классом JSON.
Простой пример. Хочу сделать процедуру как в прошлом сообщении или вот такую:

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

QueueToJson  Procedure(MyTypeQueue qList)
Root   &cJson
  Code
  Root &= json::CreateArray(qList,,'[{{"name":"*","ignore":true}, ... ]')
  Return Root.ToString()  
Но это ведь неправильно, т.к. работа с классом должна завершаться: Root.Delete() ?
А я не могу удалить ... класс используется при формировании возвращаемой строки.
Можно ли сделать деактивацию объектов при ликвидации класса ?

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

cJSON.Destruct                PROCEDURE()
  CODE
  IF NOT (SELF &= Null) then SELF.Delete().
  ...
Или я неправильно понимаю работу с классом ? Спасибо. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

Проще всего

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

retval  ANY
  retval = Root.ToString()
  Root.Delete()
  return retval
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

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

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

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

Игорь Столяров писал(а): 26 Ноябрь 2022, 21:43 Root &cJson
Для ссылок на класс деструктор не вызывается автоматически при выходе из области видимости.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

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

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

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

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

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

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

Понял. Спасибо - я этого не знал ...

Подскажите пожалуйста, можно ли сделать запрет на выгрузку нулевых значений (и bool = false)
аналогично запрету выгрузки пустых строк:

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

  Root &= json::CreateArray(qMobile,False,'[{{"name":"*","EmptyString":"ignore"}]')
Катастрофически медленно формируется строка для записи в файл: Root.ToString()
3000 записей на 4MByte могут записываться 10 минут. Это в 50 раз медленней штатного класса. :(
Спасибо.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

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

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

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

Я формирую JSON строку по произвольному списку в IDynStr за секунды (с конвертацией в UTF8 !) - тупо через перебор полей.
Но почему-то при переходе на json::CreateArray() - тоже самое занимает минуты. :(

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

  IBuffer.Cat('[')
  Loop Rec = 1 to Records(MyQueue)
    Get(MyQueue,Rec)    
    IBuffer.Cat('{{'); xAddTag = False
        
    Loop Col = 1 to Loc:IColumn  ! По полям MyQueue
       jTag &= json::CreateString(What(MyQueue,Col))
       IBuffer.Cat(Choose(xAddTag = True,',','') & '"' & Clip(Who(MyQueue,Col)) & '":' & json::ToUtf8(jTag.ToString()))
       jTag.Delete(); xAddTag = True
    end
    IBuffer.Cat('}')
  end
  IBuffer.Cat(']')
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

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

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

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

Это проще, чем невинная детская игра в крысу ... ;)
У меня вот такая пустышка выполняется около 4-х минут. Наличие данных - сильно всё усугубляет.
Мой пример в предыдущем сообщении тоже самое делает за 8 сек. Выполните пожалуйста:

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

DiaDoc.MyTest  Procedure()

qMobile    Queue
File         Byte,         Name('File')
Item         Long,         Name('Item')

Long_01      Long,         Name('Long_01')
Long_02      Long,         Name('Long_02')
Long_03      Long,         Name('Long_03')
Long_04      Long,         Name('Long_04')
Long_05      Long,         Name('Long_05')
Long_06      Long,         Name('Long_06')
Long_07      Long,         Name('Long_07')
Long_08      Long,         Name('Long_08')
Long_09      Long,         Name('Long_09')
Long_10      Long,         Name('Long_10')
Long_11      Long,         Name('Long_11')
Long_12      Long,         Name('Long_12')
Long_13      Long,         Name('Long_13')
Long_14      Long,         Name('Long_14')
Long_15      Long,         Name('Long_15')
Long_16      Long,         Name('Long_16')
Long_17      Long,         Name('Long_17')
Long_18      Long,         Name('Long_18')
Long_19      Long,         Name('Long_19')
Long_20      Long,         Name('Long_20')
Long_21      Long,         Name('Long_21')
Long_22      Long,         Name('Long_22')
Long_23      Long,         Name('Long_23')
Long_24      Long,         Name('Long_24')
Long_25      Long,         Name('Long_25')
Long_26      Long,         Name('Long_26')
Long_27      Long,         Name('Long_27')
Long_28      Long,         Name('Long_28')
Long_29      Long,         Name('Long_29')
Long_30      Long,         Name('Long_30')
Long_31      Long,         Name('Long_31')
Long_32      Long,         Name('Long_32')
Long_33      Long,         Name('Long_33')
Long_34      Long,         Name('Long_34')
Long_35      Long,         Name('Long_35')
Long_36      Long,         Name('Long_36')
Long_37      Long,         Name('Long_37')
Long_38      Long,         Name('Long_38')
Long_39      Long,         Name('Long_39')
Long_40      Long,         Name('Long_40')
Long_41      Long,         Name('Long_41')
Long_42      Long,         Name('Long_42')
Long_43      Long,         Name('Long_43')
Long_44      Long,         Name('Long_44')

Real_01      Real,         Name('Real_01')
Real_02      Real,         Name('Real_02')
Real_03      Real,         Name('Real_03')
Real_04      Real,         Name('Real_04')
Real_05      Real,         Name('Real_05')
Real_06      Real,         Name('Real_06')
Real_07      Real,         Name('Real_07')
Real_08      Real,         Name('Real_08')
Real_09      Real,         Name('Real_09')
Real_10      Real,         Name('Real_10')
Real_11      Real,         Name('Real_11')
Real_12      Real,         Name('Real_12')
Real_13      Real,         Name('Real_13')
Real_14      Real,         Name('Real_14')
Real_15      Real,         Name('Real_15')
Real_16      Real,         Name('Real_16')
Real_17      Real,         Name('Real_17')
Real_18      Real,         Name('Real_18')
Real_19      Real,         Name('Real_19')
Real_20      Real,         Name('Real_20')
             
Byte_01      Byte,         Name('Byte_01')
Byte_02      Byte,         Name('Byte_02')
Byte_03      Byte,         Name('Byte_03')
Byte_04      Byte,         Name('Byte_04')
Byte_05      Byte,         Name('Byte_05')
Byte_06      Byte,         Name('Byte_06')
Byte_07      Byte,         Name('Byte_07')
Byte_08      Byte,         Name('Byte_08')
Byte_09      Byte,         Name('Byte_09')
Byte_10      Byte,         Name('Byte_10')
Byte_11      Byte,         Name('Byte_11')
Byte_12      Byte,         Name('Byte_12')
Byte_13      Byte,         Name('Byte_13')
Byte_14      Byte,         Name('Byte_14')
Byte_15      Byte,         Name('Byte_15')
Byte_16      Byte,         Name('Byte_16')
Byte_17      Byte,         Name('Byte_17')
Byte_18      Byte,         Name('Byte_18')
Byte_19      Byte,         Name('Byte_19')
Byte_20      Byte,         Name('Byte_20')
Byte_21      Byte,         Name('Byte_21')
Byte_22      Byte,         Name('Byte_22')
Byte_23      Byte,         Name('Byte_23')
Byte_24      Byte,         Name('Byte_24')
Byte_25      Byte,         Name('Byte_25')
Byte_26      Byte,         Name('Byte_26')
Byte_27      Byte,         Name('Byte_27')
Byte_28      Byte,         Name('Byte_28')
Byte_29      Byte,         Name('Byte_29')
Byte_30      Byte,         Name('Byte_30')
Byte_31      Byte,         Name('Byte_31')
Byte_32      Byte,         Name('Byte_32')
Byte_33      Byte,         Name('Byte_33')
Byte_34      Byte,         Name('Byte_34')
Byte_35      Byte,         Name('Byte_35')
Byte_36      Byte,         Name('Byte_36')
Byte_37      Byte,         Name('Byte_37')
Byte_38      Byte,         Name('Byte_38')
Byte_39      Byte,         Name('Byte_39')
Byte_40      Byte,         Name('Byte_40')
Byte_41      Byte,         Name('Byte_41')
Byte_42      Byte,         Name('Byte_42')
Byte_43      Byte,         Name('Byte_43')
Byte_44      Byte,         Name('Byte_44')

String40_01  String(320),  Name('String40_01')
String40_02  String(320),  Name('String40_02')
String40_03  String(320),  Name('String40_03')
String40_04  String(320),  Name('String40_04')
String40_05  String(320),  Name('String40_05')
String40_06  String(320),  Name('String40_06')
String40_07  String(320),  Name('String40_07')
String40_08  String(320),  Name('String40_08')
String40_09  String(320),  Name('String40_09')
String40_10  String(320),  Name('String40_10')
String40_11  String(320),  Name('String40_11')
String40_12  String(320),  Name('String40_12')
String40_13  String(320),  Name('String40_13')
String40_14  String(320),  Name('String40_14')
String40_15  String(320),  Name('String40_15')
String40_16  String(320),  Name('String40_16')
String40_17  String(320),  Name('String40_17')
String40_18  String(320),  Name('String40_18')
String40_19  String(320),  Name('String40_19')
String40_20  String(320),  Name('String40_20')

String120_01 String(480),  Name('String120_01')
String120_02 String(480),  Name('String120_02')
String120_03 String(480),  Name('String120_03')
String120_04 String(480),  Name('String120_04')
String120_05 String(480),  Name('String120_05')
String120_06 String(480),  Name('String120_06')
String120_07 String(480),  Name('String120_07')
String120_08 String(480),  Name('String120_08')
String120_09 String(480),  Name('String120_09')
String120_10 String(480),  Name('String120_10')
String120_11 String(480),  Name('String120_11')
String120_12 String(480),  Name('String120_12')
String120_13 String(480),  Name('String120_13')
String120_14 String(480),  Name('String120_14')
String120_15 String(480),  Name('String120_15')
String120_16 String(480),  Name('String120_16')

String250_01 String(1000), Name('String250_01')
String250_02 String(1000), Name('String250_02')
String250_03 String(1000), Name('String250_03')
String250_04 String(1000), Name('String250_04')
String250_05 String(1000), Name('String250_05')
String250_06 String(1000), Name('String250_06')
String250_07 String(1000), Name('String250_07')
String250_08 String(1000), Name('String250_08')
             end

Root       &cJson
  Code

  Loop 3000 times
    Add(qMobile)
  end

  Message('Мы начинаем КВН !')
  Root  &= json::CreateArray(qMobile)
  Message(Sub(Root.ToString(),1,100))
  Root.Delete()
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

Попробуйте этот вариант (все 4 файла), у меня прирост скорости ощутимый.
Вложения
dynstrclass.CLW
(4.81 КБ) 13 скачиваний
dynstrclass.inc
(2.73 КБ) 15 скачиваний
cjson.inc
(24.47 КБ) 16 скачиваний
cjson.clw
(83.09 КБ) 15 скачиваний
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

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

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

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

Дед Пахом писал(а): 28 Ноябрь 2022, 17:44 у меня прирост скорости ощутимый
Грандиозно ! Это ведь уже совсем другая история ! :ty:
Средний прирост скорости: где-то в 4 раза, причём идёт нарастание вместе с объёмом данных.
На моём самом большом объёме данных ускорение порядка 12 раз (даже не поверил c первого раза).
Спасибо - пошёл переделывать выгрузку на штатные методы класса.

Эх, если бы ещё убрать теги с нулевыми значениями "EmptyString" = "OnlyContent" ... ?

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

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

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

Игорь Столяров писал(а): 28 Ноябрь 2022, 20:41 Эх, если бы ещё убрать теги с нулевыми значениями "EmptyString" = "OnlyContent" ... ?
Это как?
С уважением, ДП
Закрыто