Я уже поднимал этот вопрос и ответ был категоричным ... но ведь не безнадёжным.
Речь идёт об очистке структуры данных перед загрузкой.
Код: Выделить всё
cJSON.ToGroup PROCEDURE(*GROUP grp, BOOL matchByFieldNumber = FALSE, <STRING options>)
...
CLEAR(grp) ! <--- Выполняется всегда и для всех :(((
- 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()) & '}]') ...