cJSON: Перспективные опции

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

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

cJSON: Перспективные опции

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

Добрый день !

Огромное спасибо за класс ! :)
Есть непреодолимое желание обсудить два вопроса по опциям - Вы только не ругайтесь пожалуйста сразу. :)

1. При работе с большими многоуровневыми структурами хочется иметь возможность задавать значение тега через опции.
Это полезно и для отладки и для работы - когда требуется явно установить фиксированное значение тега (Value).

Что-то вроде вот такого:

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

gRequest Group
DocList  &DocQueue
FlagPrint Bool
          end
qDocList Queue(DocQueue).          
  Code
  Object &= json::CreateObject(gRequest,,'[{{"name":"DocList","instance":' & Instance(qDocList,Thread()) & '},' & |
                                           {{"name":"FlagPrint","IsBool":true,"Value":true}]')
2. Этот вопрос я поднимал пару лет назад, но я не сдаюсь. :)
Есть очень много мест где нужно выгружать простые строчные, числовые и логические массивы фиксированной длины.
Есть примеры и я знаю как это делать через QUEUE и вручную (в файле howto.md первый пример - я видел).
Но когда их много и "список в списке" - это просто жесть в реализации. :(

Что хотелось бы. Например, есть вот такая структура данных телефонного справочника:

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

qSupplier Queue
user   CString(81)
phones CString(41),Dim(5)
         end 
  Code
  Object &= json::CreateObject(qSupplier,,'[{{"name":"phones","EmptyString":"ignore","EasyDim":true}]')         
и нужно легко и просто получить из неё:
[{"user":"Игорь","phones":["+79175555555","+7917123456"]}, {"user":"Света","phones":["+7917123457","+79175557766"]}, ...]

Есть опция "ArraySize" - но я не понимаю как её использовать (нет примера) ... :(

Спасибо за рассмотрение ! :)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Перспективные опции

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

По поводу пункта 2, есть опция FieldNumber, как-то так:

Object &= json::CreateObject(qSupplier,,'[{{"name":"phones","EmptyString":"ignore","FieldNumber":1}]')
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Перспективные опции

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

Дед Пахом писал(а): 13 Сентябрь 2024, 12:43 По поводу пункта 2, есть опция FieldNumber, как-то так:
А нет, не тот случай, у вас просто dim(5), а не queue.
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Перспективные опции

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

Кстати, а сейчас какой результат получается?
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Перспективные опции

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

А куда пример делся? Пришлось самому писать, так вот всё работает:

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

Test1                         PROCEDURE()
qSupplier                       Queue
user                              CString(81)
phones                            CString(41),Dim(5)
                                end 
Object                          &cJSON, AUTO

  Code
  qSupplier.user = 'Mike'
  qSupplier.phones[1] = '499-181-00-00'
  qSupplier.phones[2] = '999-181-00-00'
  ADD(qSupplier)
  qSupplier.user = 'Luba'
  qSupplier.phones[1] = '495-292-00-00'
  qSupplier.phones[2] = '999-292-00-00'
  ADD(qSupplier)
  
  Object &= json::CreateArray(qSupplier,,'[{{"name":"phones","EmptyString":"ignore"}]')

  IF NOT Object &= NULL
    printd(Object.ToString(TRUE))
    Object.Delete()
  END
Результат:

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

[7924] [{ 
[7924]   "user": "Mike", 
[7924]   "phones": ["499-181-00-00",  "999-181-00-00"] 
[7924]  },  { 
[7924]   "user": "Luba", 
[7924]   "phones": ["495-292-00-00",  "999-292-00-00"] 
[7924]  }]
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Перспективные опции

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

Дед Пахом писал(а): 13 Сентябрь 2024, 16:27 А куда пример делся?
Спасибо ! Я убрал пример из-за того что тоже нашёл json::CreateArray() для QUEUE. И это супер ! :)
Но теперь я ещё хочу проверить экспорт GROUP c вложенными массивами (которые сейчас делаю как QUEUE).
Что-то вроде:

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

User     Group
Name   CString(81)
WorkPhones CString(41),Dim(5)
Email CString(41),Dim(4)
Messenger CString(41),Dim(3)
         end
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Перспективные опции

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

По аналогии с сами знаете чем:"Make Clarion Great Again" - MACLAGA
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Перспективные опции

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

По поводу пункта 1, могу посоветовать использовать callback TCJsonRuleHelper.ApplyCB:

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

rh.ApplyCB                    PROCEDURE(STRING pFldName, *typCJsonFieldRule pRule, ? pValue)
  CODE
  IF pFldName = 'FlagPrint
    RETURN TRUE
  END
  RETURN pValue
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Перспективные опции

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

Дед Пахом писал(а): 13 Сентябрь 2024, 16:49 По аналогии с сами знаете чем
Спасибо - всё получилось. Это многое теперь меняет.
То ли я стал более чётко формулировать задачи, то ли пропустил момент когда это заработало ...
Как я понял, класс находится в состоянии великой стабильности и изменить его может только нахождение ошибки. ;)
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Перспективные опции

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

Дед Пахом писал(а): 13 Сентябрь 2024, 16:59 могу посоветовать использовать callback TCJsonRuleHelper.ApplyCB
Спасибо - я знаю этот универсальный костыль ... ;) Например, через него мы загружаем файлы в BASE64.

Моё субъективное мнение, что cJSON - это не просто запись текстовых файлов на основе структур Clarion.
Это ещё и красивая логика работы с современным структурированным форматом обмена данными.
Ну, или по крайне мере, так задумывалось изначально ... ;)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Перспективные опции

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

Костыль это на каждый чих заводить новую опцию.
С уважением, ДП
Ответить