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

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

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

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

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

Вот такой вариант, удовлетворяет моим хотелкам. Тестировал, правда, на совсем примитивных вводных.
Вложения
cjson.clw
(79.51 КБ) 25 скачиваний
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Спасибо. Достаточно сложный вариант сложения правил, чего ранее в классе ведь не было ...
Для моих простых хотелок, вроде "все выключили и потом включили два" конечно подходит. :ty:

Но смущает вот такая комбинация. Должно ли выгружаться Field02 ?
Ведь для него (как и всех других полей) должно действовать общее правило: Ignore = true ...

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

jParams &= json::CreateObject(MyDoc,,'{{"name":"Name","ignore":False},{{"name":"*","ignore":true},{{"name":"Field02","IsQueue":True}')
  ! Выгружает только поля: Name и Field02
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

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

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

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

Я согласный упроститься ещё со вчера ... :)
Как по мне - то комбинация с явными параметрами самая понятная и простая. Но я здесь лузером ...

Либо общее правило, либо задаём ВСЁ индивидуально. Котлеты отдельно, мухи отдельно.
Все поля булевы, а для Expired ещё меняем имя:

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

[{"name"="Expired","jsonname":"IsExpired","isbool":true},{"name"="*","isbool":true}]
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

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

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

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

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

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

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

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

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

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

На примерах всё работает, в боевых задачах буду следить. :ty:
Главное, что это решение не ломает существующие схемы выгрузки.
А мне теперь надо катастрофически упростить огромные правила выгрузки. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Добрый день !

Да, это снова я за воспоможением по той же теме ... :)
Берём прекрасный штатный пример: QueueInGroupTest и помещаем списк телефонов во вложенный блок JSON:

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

!Было:
!testString  STRING('{{"name": "Carl", "addresses": [{{"city": "Rivercity","street": "Main st","house": 123},{{"city": "Rivertown","street": "Park st","house": 987}], "phones": ["1234567", "7654321"]}')
!Стало
testString  STRING('{{"name": "Carl", "addresses": [{{"city": "Rivercity","street": "Main st","house": 123},{{"city": "Rivertown","street": "Park st","house": 987}], "phonelist":{{"phones": ["1234567", "7654321"]}}')

!Для наглядности:
{
  "name": "Carl",
  "addresses": [
    {
      "city": "Rivercity",
      "street": "Main st",
      "house": 123
    },
    {
      "city": "Rivertown",
      "street": "Park st",
      "house": 987
    }
  ],
  "phonelist": {
    "phones": [
      "1234567",
      "7654321"
    ]
  }
}
Список телефонов перестал загружаться сразу.
А ведь по сути ничего не поменялось для настроек загрузки через INSTANCE(PhonesQ, THREAD()) ... но не работает.
Метод просто не просматривает вложенные блоки ?

Как загрузить такой массив через FindObjectItem('phones') + ToQueue(PhonesQ) - я знаю.
Но непонятно почему "выключается" загрузка через буфер ? Я чего-то опять не понимаю ?
Заранее спасибо.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

Потому что несовпадение по структуре, вот почему :-)
Если Phones поместить в группу PhoneList, то всё начинает работать:

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

PersonGrp                       GROUP
Name                              STRING(20)
Addresses                         &QUEUE      !- reference to AddressQ
Phonelist                         GROUP
Phones                              &QUEUE      !- reference to PhonesQ
                                  END
                                END
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

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

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

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

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

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

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

Привет всем !
У меня снова непонятки. :( Прошу рассмотреть пример:

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

MyTest     Procedure()
Q_Docs         Queue,Type
SignedContent    Group
Content            String(20)
Signature          String(20)
TestFlag           Bool
                 end
               end

gMessage       Group
Docs             &Q_Docs
DocsInstance     Long
               end

qFile          Queue(Q_Docs).
Params         &cJson
  Code

  qFile.SignedContent.Content = 'Текст'; Add(qFile)

  gMessage.Docs         &= qFile
  gMessage.DocsInstance  = Instance(gMessage.Docs,Thread())

  Params &= json::CreateObject(gMessage,,'[{{"name":"*",            "ignore":true},'  & |
                                          '{{"name":"Docs",         "isQueue":true},' & |
                                          '{{"name":"DocsInstance", "ignore":false},' & |  ! Это мона убрать
                                          '{{"name":"SignedContent","ignore":false},' & |
                                          '{{"name":"Content",      "ignore":false},' & |
                                          '{{"name":"TestFlag",     "isBool":true}]')

  Message(Params.ToString(True))
Результат:

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

{
  "docs": [
    {
      "signedcontent": {
        "content": "Текст",
        "testflag": false
      },
      "testflag": false   ! <--- ??? Откуда взялся этот дубликат ???
    }
  ]
}
Заранее спасибо за содействие ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Можно проще, но c тем же конфузом.
Что-то пошло не так с полем "Signature" ... :(

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

  Params &= json::CreateObject(gMessage,,'[{{"name":"Docs","isQueue":true},{{"name":"Signature","ignore":true}]')
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

Мой косяк, прикрепил фикс, проверьте.
Вложения
cjson.clw
(76.46 КБ) 18 скачиваний
С уважением, ДП
Закрыто