cJSON: Описание структур данных

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

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

cJSON: Описание структур данных

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

Добрый день !

Я уже поднимал этот вопрос и ответ был категоричным ... но ведь не безнадёжным. ;)
Речь идёт об очистке структуры данных перед загрузкой.

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

cJSON.ToGroup                 PROCEDURE(*GROUP grp, BOOL matchByFieldNumber = FALSE, <STRING options>)
...    
  CLEAR(grp)  ! <--- Выполняется всегда и для всех :(((
Исходя из текущих возможностей класса, выполнение Clear() для полей группы с опцией:
- IGNORE: является непонятным (мы ведь просили пропускать поле при обработке, а не убивать его содержимое);
- INSTANCE: является ошибочным, потому, что мы конкретно его теряем (указатель на список и память вместе с ним). :(

Штатный пример: QueueInGroupTest.
Предположим, что у нас в группе несколько однотипных списков
(или мы хотим иметь доступ к данными вложенного списка через имя группы - это нормально !):

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

!- phone queue
Q_PhonesType           QUEUE,TYPE
Phone                             STRING(20)
                                END
!- person group
PersonGrp                       GROUP
Name                              STRING(20)
PhonesWork                     &Q_PhonesType  !     &QUEUE      !- reference to PhonesQ
PhonesHome                    &Q_PhonesType
...
                                END
И всё. В этом месте наш карточный домик рухнул. Потому что:

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

  CODE
  !- initialize queue references
  PersonGrp.PhonesWork &= New(Q_PhonesType)
  PersonGrp.PhonesHome &= New(Q_PhonesType)
 
  !- parse json
  IF NOT parser.ToGroup(testString, PersonGrp, FALSE, '[{{"name":"PhonesWork", "instance":'& Instance(PersonGrp.PhonesWork,Thread()) &'}, '
                     '{{"name":"PhonesHome", "instance":'& Instance(PersonGrp.PhonesHome,Thread()) &'}]') ...
                     
  ! ALLES - Списки PersonGrp.PhonesWork / PersonGrp.PhonesHome - потеряны навсегда !
Предложения к обсуждению.
Заменить безусловный CLEAR(grp) в начале cJSON.ToGroup() на метод cJSON.ClearGroupField(), который:
- Будет выполняться после того как определены все правила для полей, но до загрузки строки JSON.
- Очистка выполняется отдельно для каждого поля Group, с учётом заданных для поля правил (пропускаем IGNORE / INSTANCE однозначно),
и наверно (ISQUEUE + следующее поле) тоже.
- Там же можно сразу сделать опцию "DefaultValue" для опциональной установки начального значения поля группы перед загрузкой ...

Никаких проблем с совместимостью ...
И извините, но может быть я желаю подгрузить из JSON спискок домашних телефонов не меняя всего остального.
Почему сразу нет, особенно если это можно сделать ? ;) :

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

  IF NOT parser.ToGroup(testString, PersonGrp, FALSE, '[{{"name":"*", "ignore":true},'
                     '{{"name":"PhonesHome", "instance":' & Instance(PersonGrp.PhonesHome,Thread()) & '}]') ...
:ty:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Описание структур данных

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

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

cJSON: Описание структур данных

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

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

cJSON: Описание структур данных

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

Игорь Столяров писал(а): 14 Январь 2023, 7:30 Предложения к обсуждению.
Кто возьмётся делать? С меня merge.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

cJSON: Описание структур данных

Сообщение Admin »

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

cJSON: Описание структур данных

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

Игорь Столяров писал(а): 14 Январь 2023, 7:30 Предложения к обсуждению.
Я показал свой ход мыслей, когда напарываюсь на затирание указателей при использовании ToGroup().
Старался, что бы моё изложение было обоснованным и логичным. Но я открыт услышать и другие точки зрения.
Потому, что существуют в т.ч. и технологические ограничения, как например с разделением переменных
Long / Bool или выделению динамической памяти через What() для указателей / Any полей ...
Дед Пахом писал(а): 18 Январь 2023, 0:28 Кто возьмётся делать?
Наверно сейчас, кроме Вас, никто не обладает полнотой всей информации о внутренней структуре и работе класса.
А здесь нужно именно это, т.к. субклассинг не решает вопрос. С другой стороны - если вдруг будет принята идея
привлечь к разработке сообщество и класс будет документирован - то лично я в меру своих сил буду рад принять участие. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Описание структур данных

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

Admin писал(а): 18 Январь 2023, 1:47 Учи людей делать пулл реквесты
Любой язык описаний имеет свою логику и внутреннюю красоту. JSON, XML, C, Clarion и т.д.
Конструкции вроде:

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

MyGroup1 Group
MyList Byte  ! Так мы можем задать имя списка внутри группы. Понятно, красиво и удобно ?
  end
  
MyGroup2 Group
MyList &Queue  ! Здесь используем понятный и вполне логичный вариант описания данных
  end 
  
qList Queue.
  Code
  ToGroup(MyGroup1,,'{{"name":"MyList", "instance":' & Instance(qList,Thread()) & '}]') ! MyList &= qList ?!
  Message(Records(qList)) ! = OK 
  
  MyGroup2.MyList &= qList  ! Но мы выберем всё-таки правильный путь описания структуры данных
  ToGroup(MyGroup2,,'{{"name":"MyList", "instance":' & Instance(MyGroup2.MyList,Thread()) & '}]')
  Message(Records(MyGroup2.MyList)) ! = ERROR 
всегда вызывали некоторое непонимание ... Да, при наличии опыта - можно выгибаться и работать с этим.
Но (как я понимаю) вопрос реквестов - это дополнительный функционал, а не базовая логика ... ;)
Последний раз редактировалось Игорь Столяров 18 Январь 2023, 11:48, всего редактировалось 5 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

cJSON: Описание структур данных

Сообщение finsoftrz »

О, Вы еще с javascript не пробовали работать. :-)
C6/C11, ШВС, tps/btrieve.
Ответить