Страница 13 из 18
cJSON: Формат полей для вложенных структур
Добавлено: 24 Декабрь 2022, 11:51
Игорь Столяров
Дед Пахом писал(а): 22 Декабрь 2022, 21:44
Если HOWMANY возвращает 1, то невозможно понять, то ли это просто поле, то ли массив DIM(1)
Да.
Но если при HOWMANY = 1 применить к полю Maximum(Field,1), то мы сможем однозначно отличить поле от Dim(1) ...
Или я не прав ?

cJSON: Формат полей для вложенных структур
Добавлено: 24 Декабрь 2022, 12:41
Дед Пахом
- Пятачок, неси ружьё!
cJSON: Формат полей для вложенных структур
Добавлено: 26 Декабрь 2022, 9:05
Игорь Столяров
Есть места, где пчёлы делают неправильный мёд (Bool = Long) и тут ничего не поделаешь.
Но попробовать убрать двухуровневый (!) костыль с DIM(1) - можно, ведь возможно кому-то этот хвост был нужен ...

cJSON: Формат полей для вложенных структур
Добавлено: 26 Декабрь 2022, 14:08
Дед Пахом
Игорь Столяров писал(а): 24 Декабрь 2022, 11:51
Но если при HOWMANY = 1 применить к полю Maximum(Field,1), то мы сможем однозначно отличить поле от Dim(1) ...
А проверить эту Вашу теорию не пробовали?
cJSON: Формат полей для вложенных структур
Добавлено: 26 Декабрь 2022, 14:16
Игорь Столяров
Пробовал. Для простой переменной возвращается 0, а для массива размерность по первому измерению.
У Вас иначе ?

cJSON: Формат полей для вложенных структур
Добавлено: 26 Декабрь 2022, 16:19
Дед Пахом
Где? Надо пробовать прямо в cjson.clw, где-нибудь рядом с вызовом HOWMANY.
cJSON: Формат полей для вложенных структур
Добавлено: 26 Декабрь 2022, 16:31
Игорь Столяров
Я же в святое немытыми руками не лезу ...

Просто в коде своей программы создал несколько переменных и массивов, и проверил для них значение Maximum(Field,1).
Там вроде бы всё было правильно получается ...
cJSON: Формат полей для вложенных структур
Добавлено: 29 Декабрь 2022, 21:52
Игорь Столяров
Добрый вечер !
Неудача постигла меня при попытке создать структуру для обмена файлами.

Не воспринимает поля для выгрузки с типом Any (а он нужен для загрузки-с ...).
Пример (проблему видно и на Group, хотя конечно же интересует Queue):
Код: Выделить всё
DocClass.MyTest Procedure()
Root &cJson
rh Class(TCJsonRuleHelper)
FindCB Procedure(String pFldName, *typCJsonFieldRule pRule), DERIVED
end
gPacket Group
!FileInBase64 CString(File:MaxFileName) ! Так работает
FileInBase64 Any ! А ВОТ ТАК НЕ РАБОТАЕТ !!!
end
Code
gPacket.FileInBase64 = 'c:\shet.docx'
Root &= json::CreateObject(gPacket,,'[{{"name":"*","RuleHelper":"' & Address(rh) & '"}]')
If Not (Root &= Null)
json::SaveFile('R:\Test.json',Root.ToUtf8())
Root.Delete()
end
rh.FindCB Procedure(String pFldName, *typCJsonFieldRule pRule)
Code
pRule.EmptyString = 'ignore'
pRule.IgnoreZero = True
pRule.IgnoreEmptyObject = True
pRule.IgnoreEmptyArray = True
If Sub(pFldName,1,12) = 'fileinbase64' ! В поле имя файла для записи его содержимого в тег Base64
pRule.IsFile = True
pRule.IsBase64 = True
end
Заранее спасибо за помощь ...

cJSON: Формат полей для вложенных структур
Добавлено: 29 Декабрь 2022, 22:04
Дед Пахом
Для ANY полей надо реализовать rh.ApplyCB().
cJSON: Формат полей для вложенных структур
Добавлено: 29 Декабрь 2022, 23:09
Игорь Столяров
Дед Пахом писал(а): 29 Декабрь 2022, 22:04rh.ApplyCB()
Спасибо ... Неожиданное, но решение.
Правильно ли я понимаю, что если у меня загружается JSON в список с N файлами, то я по N раз
должен продублировать один и тот же код (теперь) в двух местах ? По штатному примеру:
Спасибо.
Код: Выделить всё
jPerson.ToQueue(Persons,, |
printf( '' |
& '[' |
& ' {{"name":"*","rulehelper":%i},' |
& ' {{"name":"Photo01","auto":true},' |
& ' {{"name":"Photo02","auto":true}', |
... И ТАК ВРУЧНУЮ ДУБЛИРУЕМ ДЛЯ КАЖДОГО ТЕГА
& ' {{"name":"Photo10","auto":true}' |
& ']', ADDRESS(rh)))
rh.AutoCB PROCEDURE(STRING pFldName, cJSON pItem)
CODE
IF pFldName = 'PHOTO01'
Persons.Photo01 = printf('%w', pItem.GetStringValue())
END
IF pFldName = 'PHOTO02'
Persons.Photo02 = printf('%w', pItem.GetStringValue())
END
.... И ТАК ВРУЧНУЮ ДУБЛИРУЕМ ДЛЯ КАЖДОГО ТЕГА
IF pFldName = 'PHOTO10'
Persons.Photo10 = printf('%w', pItem.GetStringValue())
END
cJSON: Формат полей для вложенных структур
Добавлено: 29 Декабрь 2022, 23:33
Дед Пахом
В FindCB можно задать правило "auto" по маске.
cJSON: Формат полей для вложенных структур
Добавлено: 29 Декабрь 2022, 23:42
Игорь Столяров
Дед Пахом писал(а): 29 Декабрь 2022, 23:33
В FindCB можно задать правило "auto" по маске.
Да, спасибо. Мы именно так и делаем (если тип поля не ANY).
Но ни в списке параметров загрузки из JSON, ни в rh.AutoCB этого делать нельзя.
Ведь в rh.AutoCB мы проверяем имя тега СТРОГО на "PHOTO" для записи значения в тег c именем "PHOTO" ...
Я извиняюсь, а нельзя ли записать значение в тег, если его имя подходит по условию (в т.ч. и по маске) ?
cJSON: Формат полей для вложенных структур
Добавлено: 29 Декабрь 2022, 23:49
Дед Пахом
Я имел в виду этот кусок можно сократить:
Игорь Столяров писал(а): 29 Декабрь 2022, 23:09
& ' {{"name":"Photo01","auto":true},' |
& ' {{"name":"Photo02","auto":true}', |
... И ТАК ВРУЧНУЮ ДУБЛИРУЕМ ДЛЯ КАЖДОГО ТЕГА
& ' {{"name":"Photo10","auto":true}' |
cJSON: Формат полей для вложенных структур
Добавлено: 30 Декабрь 2022, 0:14
Игорь Столяров
Дед Пахом писал(а): 29 Декабрь 2022, 23:49
Я имел в виду этот кусок можно сократить
Спасибо ! Но как сегодня выяснилось, что поля c типом ANY проклятые в FindCB() и я не могу
при ЗАГРУЗКЕ ИЗ JSON использовать аналогичную выгрузке комбинацию ?
Код: Выделить всё
Root.ToGroup(gPacket,,'[{{"name":"*","RuleHelper":"' & Address(rh) & '"}]')
rh.FindCB Procedure(String pFldName, *typCJsonFieldRule pRule)
Code
...
If Sub(pFldName,1,5) = 'photo' ! Поле ANY для загрузки содержания тега из Base64
pRule.IsBase64 = True
end
cJSON: Формат полей для вложенных структур
Добавлено: 30 Декабрь 2022, 0:24
Дед Пахом
Для ANY полей можно использовать только rh.AutoCB.
А без загрузки содержимого файлов из json в очередь прямо-таки нельзя обойтись? Если Вы просто сохраняете файлы на диск, можно этот промежуточный шаг пропустить.