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

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

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

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

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

Дед Пахом писал(а): 22 Декабрь 2022, 21:44 Если HOWMANY возвращает 1, то невозможно понять, то ли это просто поле, то ли массив DIM(1)
Да.
Но если при HOWMANY = 1 применить к полю Maximum(Field,1), то мы сможем однозначно отличить поле от Dim(1) ...
Или я не прав ? ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

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

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

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

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

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

Есть места, где пчёлы делают неправильный мёд (Bool = Long) и тут ничего не поделаешь.
Но попробовать убрать двухуровневый (!) костыль с DIM(1) - можно, ведь возможно кому-то этот хвост был нужен ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

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

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

Игорь Столяров писал(а): 24 Декабрь 2022, 11:51 Но если при HOWMANY = 1 применить к полю Maximum(Field,1), то мы сможем однозначно отличить поле от Dim(1) ...
А проверить эту Вашу теорию не пробовали?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7447
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 51 раз

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

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

Пробовал. Для простой переменной возвращается 0, а для массива размерность по первому измерению.
У Вас иначе ? ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

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

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

Игорь Столяров писал(а): 26 Декабрь 2022, 14:16 Пробовал.
Где? Надо пробовать прямо в cjson.clw, где-нибудь рядом с вызовом HOWMANY.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7447
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 51 раз

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

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

Я же в святое немытыми руками не лезу ... ;)
Просто в коде своей программы создал несколько переменных и массивов, и проверил для них значение Maximum(Field,1).
Там вроде бы всё было правильно получается ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7447
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 51 раз

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

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

Добрый вечер !

Неудача постигла меня при попытке создать структуру для обмена файлами. :(
Не воспринимает поля для выгрузки с типом 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
Заранее спасибо за помощь ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

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

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

Для ANY полей надо реализовать rh.ApplyCB().
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7447
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 51 раз

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

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

Дед Пахом писал(а): 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  
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

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

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

В FindCB можно задать правило "auto" по маске.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7447
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 51 раз

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

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

Дед Пахом писал(а): 29 Декабрь 2022, 23:33 В FindCB можно задать правило "auto" по маске.
Да, спасибо. Мы именно так и делаем (если тип поля не ANY).
Но ни в списке параметров загрузки из JSON, ни в rh.AutoCB этого делать нельзя.
Ведь в rh.AutoCB мы проверяем имя тега СТРОГО на "PHOTO" для записи значения в тег c именем "PHOTO" ...
Я извиняюсь, а нельзя ли записать значение в тег, если его имя подходит по условию (в т.ч. и по маске) ?
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

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

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

Я имел в виду этот кусок можно сократить:
Игорь Столяров писал(а): 29 Декабрь 2022, 23:09 & ' {{"name":"Photo01","auto":true},' |
& ' {{"name":"Photo02","auto":true}', |

... И ТАК ВРУЧНУЮ ДУБЛИРУЕМ ДЛЯ КАЖДОГО ТЕГА

& ' {{"name":"Photo10","auto":true}' |
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7447
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 51 раз

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

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

Дед Пахом писал(а): 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
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

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

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

Для ANY полей можно использовать только rh.AutoCB.
А без загрузки содержимого файлов из json в очередь прямо-таки нельзя обойтись? Если Вы просто сохраняете файлы на диск, можно этот промежуточный шаг пропустить.
С уважением, ДП
Закрыто