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

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

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

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

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

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

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

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

Как Вы говорите "противоречие" заключается в том, что Вы считаете что под каждую
структуру данных для загрузки из JSON нужно делать свою обработку.
У нас 20 типовых структур данных ? Значит 20 процедур обработки и потом всё это отслеживать и изменять. :(

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

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

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

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

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

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

Т.е. всё упирается в ограничение, что динамическое выделение памяти возможно только
для фиксированного поля указателя. А если мы получаем ссылку на указатель - то можем
только оперировать значением поля, но не выделением для него памяти ... Треш ! Все в С++ ! :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Дядя Фёдор, Вы неправильно бутерброд держите, надо колбасой вниз.

Работа с указателями в кларионе отличается от си. Указатель содержит адрес и тип значения, на которое он указывает. В си только адрес. Про это ББ давным давно писал, сделано это специально, чтобы повысить надёжность программ, так как большинство проблем в си связана со сбоями в указателях. Почти дословная цитата. Возможно, ноги у "ограничения" растут отсюда.

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

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

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

finsoftrz писал(а): 30 Декабрь 2022, 19:44 Дядя Фёдор, Вы неправильно бутерброд держите, надо колбасой вниз.
Тут скорее старая история про то, что красивая идея дизайнера - это всегда страшный сон инженера. ;)
Как я понимаю, в Clarion нельзя управлять памятью по ссылке на ссылку ... что в сях как стакан воды. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7335
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Дед Пахом писал(а): 30 Декабрь 2022, 16:39 В ApplyCB есть значение тега (в случае "IsBase64":true декодированное), что мешает сделать NEW STRING(LEN(CLIP(pValue)) и присвоить значение?
OK ! В контексте вчерашнего обсуждения (невозможно создать динамическую строку для поля структуры адресованной через What())
я хочу создать отдельный список с фиксированным именем для приёма бинарных данных из BASE64, и запоминать номер записи в нём:

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

MyGroup  Group
...
Photo_01  String(36)  ! -> MyFiles.ID
Photo_02  String(36)  ! -> MyFiles.ID
...
Photo_99  String(36)  ! -> MyFiles.ID
end

MyFiles Queue
ID  String(36)
Content  Any
  end
Теперь в загружаемой структуре MyGroup нет полей с типом ANY, а значит метод AutoCB() - мне не нужен.
Но становится всё очень непонятно с параметром pValue в методе ApplyCB():

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

rh.ApplyCB  PROCEDURE(STRING pFldName, *typCJsonFieldRule pRule, ? pValue)
  Code
  If Sub(Lower(pFldName),1,5) = 'photo'
     Clear(MyFiles)
     MyFiles.ID = GetGUID()
     MyFiles.Content = pValue  ! Вроде бы здесь полное содержание бинарного тега из BASE64
     Add(MyFiles,MyFiles.ID)
     If ~ErrorCode() then pValue = MyFiles.ID else Clear(pValue).  ! Но тогда вот это выглядит очень странно :(
  end     
  RETURN pValue
Ситуацию можно было бы разрулить и через AutoCB(), если бы можно было в нём получить указатель
на текущее поле заполняемой структуры для записи в него значения MyFiles.ID ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

Игорь Столяров писал(а): 31 Декабрь 2022, 7:57 Но тогда вот это выглядит очень странно :(
Игорь Столяров писал(а): 31 Декабрь 2022, 7:57 Ситуацию можно было бы разрулить и через AutoCB()
Если честно, я ничего не понял, можете пояснить: что за ситуация, что выглядит странно?

Такой код, по мне, логичнее и понятнее:

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

     MyFiles.ID = GetGUID()
     MyFiles.Content = CLEAR(pValue)
     Add(MyFiles,MyFiles.ID)
     RETURN MyFiles.ID
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7335
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Дед Пахом писал(а): 31 Декабрь 2022, 10:24 что выглядит странно
- В параметре pValue получаем некую (большую) строку со значением тега. OK !
- Записываем эту строку как ANY в отдельный QUEUE. OK !
- Но потом этому же параметру pValue нужно присвоить 32 символьный код ID (GUID) ...
Тем более, что Size(pValue) = 4, т.е. это адрес ХЗ знает чего и в каком состоянии.
Дед Пахом писал(а): 31 Декабрь 2022, 10:24 RETURN MyFiles.ID
А что так можно было ? Тогда всё красиво и правильно ! :ty:
Потому как мною предполагалось, что возвращаться должен адрес (указатель) ....
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7335
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Добрый день !

Если (вдруг) можно мечтать о Рождественском релизе - прошу рассмотреть возможность добавления индикатора
выполнения по аналогии с LibCurl. Хотя бы для json::CreateArray() / ToQueue() - там вроде бы всё линейно и очевидно:

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

TCurlHTTPClassEx  Class(TCurlHTTPClass),Type
XFerInfo            PROCEDURE(REAL dltotal, REAL dlnow, REAL ultotal, REAL ulnow), LONG, PROC, VIRTUAL
                  end
:ty:
Последний раз редактировалось Игорь Столяров 02 Январь 2023, 13:29, всего редактировалось 2 раза.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Кстати, по поводу скорости загрузки. Мне как-то позвон
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Кстати, по поводу скорости загрузки. Как-то написал клиент, что зависает программа при получении входящих всд в ветисе. Я подключился, оказалось, что размер полученного xml файла порядка 5мб. То есть программа не зависла, а долго его разбирала. Долго это более 10 мин. Для разбора xml я генерю vbs скрипт, который с помощью стандартного мс парсера преобразует его в простую структуру из пар префикс : значение. Затем эта структура уже раскладывается по нескольким кьюшкам. Выяснилось, что разбор xml файла и запись в структуру выполняется достаточно шустро, а львиную долю времени занимает раскладка значений по кьюшкам. Причина в универсальности загрузки. Если вместо маппинга полей кьюшек использовать жёсткую структуру case на префикс, то скорость должна, по идее, вырасти значительно. До переделки дело не дошло, так как такие большие файлы не так часто прилетают. Но на заметку взял.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7335
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Не наш случай. Тупит именно json::LoadFile(), я конечно проверил перед тем как сказать.
Ну как тупит ... Файл 5MB загружается 15-20 сек. Заголовок потом считывается за секунду (при правильной структуре JSON).
Но файлов может быть много и операция поиска нужного пакета уже занимает минуты, а то и десятки минут ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Смотреть лень, но зная деда, могу предположить, что чтение файла сделано через win api, и вряд ли можно ускорить. Поэтому ход мысли правильный. Можно в начало файла поместить какой-то идентификатор стандартного размера (в той же json структуре) и проверять его. При этом модифицировать класс не обязательно. Насколько я понял, выгружаете всю эту беду Вы тоже сами.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7335
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

finsoftrz писал(а): 02 Январь 2023, 13:21 чтение файла сделано через win api, и вряд ли можно ускорить
Так и есть.
finsoftrz писал(а): 02 Январь 2023, 13:21 Можно в начало файла поместить какой-то идентификатор стандартного размера
Кстати да. Хорошая идея. Можно самому считать первое кило файла, найти хвостик заголовка пакета и обрезать
его завершением строки JSON. А полученный обрубок правильной структуры уже загрузить штатными средствами класса. :ty:
За теми кто отстал - не возвращаться. (С) Кодекс
Закрыто