Страница 1 из 1

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

Добавлено: 14 Январь 2023, 7:30
Игорь Столяров
Добрый день !

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

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

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:

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

Добавлено: 17 Январь 2023, 0:27
Дед Пахом
Я посмотрю завтра, только что эту ветку увидел.

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

Добавлено: 17 Январь 2023, 6:19
Игорь Столяров
Дед Пахом писал(а): 17 Январь 2023, 0:27 Я посмотрю завтра, только что эту ветку увидел
Спасибо ! Заметьте пожалуйста, что это не я настаивал на отдельных темах для каждого вопроса ... ;)

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

Добавлено: 18 Январь 2023, 0:28
Дед Пахом
Игорь Столяров писал(а): 14 Январь 2023, 7:30 Предложения к обсуждению.
Кто возьмётся делать? С меня merge.

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

Добавлено: 18 Январь 2023, 1:47
Admin
Дед Пахом писал(а): 18 Январь 2023, 0:28 Кто возьмётся делать? С меня merge.
Давно хотел сказать. Учи людей делать пулл реквесты.

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

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

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

Добавлено: 18 Январь 2023, 9:42
Игорь Столяров
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 
всегда вызывали некоторое непонимание ... Да, при наличии опыта - можно выгибаться и работать с этим.
Но (как я понимаю) вопрос реквестов - это дополнительный функционал, а не базовая логика ... ;)

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

Добавлено: 18 Январь 2023, 11:31
finsoftrz
О, Вы еще с javascript не пробовали работать. :-)