Страница 1 из 1

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

Добавлено: 13 Сентябрь 2024, 8:14
Игорь Столяров
Добрый день !

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

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" - но я не понимаю как её использовать (нет примера) ... :(

Спасибо за рассмотрение ! :)

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

Добавлено: 13 Сентябрь 2024, 12:43
Дед Пахом
По поводу пункта 2, есть опция FieldNumber, как-то так:

Object &= json::CreateObject(qSupplier,,'[{{"name":"phones","EmptyString":"ignore","FieldNumber":1}]')

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

Добавлено: 13 Сентябрь 2024, 12:53
Дед Пахом
Дед Пахом писал(а): 13 Сентябрь 2024, 12:43 По поводу пункта 2, есть опция FieldNumber, как-то так:
А нет, не тот случай, у вас просто dim(5), а не queue.

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

Добавлено: 13 Сентябрь 2024, 12:54
Дед Пахом
Кстати, а сейчас какой результат получается?

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

Добавлено: 13 Сентябрь 2024, 16:27
Дед Пахом
А куда пример делся? Пришлось самому писать, так вот всё работает:

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

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]  }]

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

Добавлено: 13 Сентябрь 2024, 16:47
Игорь Столяров
Дед Пахом писал(а): 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

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

Добавлено: 13 Сентябрь 2024, 16:49
Дед Пахом
По аналогии с сами знаете чем:"Make Clarion Great Again" - MACLAGA

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

Добавлено: 13 Сентябрь 2024, 16:59
Дед Пахом
По поводу пункта 1, могу посоветовать использовать callback TCJsonRuleHelper.ApplyCB:

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

rh.ApplyCB                    PROCEDURE(STRING pFldName, *typCJsonFieldRule pRule, ? pValue)
  CODE
  IF pFldName = 'FlagPrint
    RETURN TRUE
  END
  RETURN pValue

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

Добавлено: 13 Сентябрь 2024, 19:27
Игорь Столяров
Дед Пахом писал(а): 13 Сентябрь 2024, 16:49 По аналогии с сами знаете чем
Спасибо - всё получилось. Это многое теперь меняет.
То ли я стал более чётко формулировать задачи, то ли пропустил момент когда это заработало ...
Как я понял, класс находится в состоянии великой стабильности и изменить его может только нахождение ошибки. ;)

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

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

Моё субъективное мнение, что cJSON - это не просто запись текстовых файлов на основе структур Clarion.
Это ещё и красивая логика работы с современным структурированным форматом обмена данными.
Ну, или по крайне мере, так задумывалось изначально ... ;)

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

Добавлено: 14 Сентябрь 2024, 12:47
Дед Пахом
Костыль это на каждый чих заводить новую опцию.