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

cJSON: Предложения по развитию проекта

Добавлено: 19 Сентябрь 2024, 7:38
Игорь Столяров
ДД !

Здесь я буду записывать предложения, которые возникают у меня при работе с классом cJSON.
Возможно у Вас когда-нибудь появится желание что-то из написанного переименовать и сделать ... ;)

1. Полноценное управление выгрузкой тега в зависимости от его содержимого.
Можно считать это обобщением существующих опций: EmptyString / IgnoreFalse / IgnoreZero

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

  {"Name":"Print","IsBool":true,"IgnoreValue":true}
  {"Name":"Font", "IgnoreValue":11}
  
!  "Name":"*" - здесь в принципе не нужен
2. Хоть какой-то механизм управления самими опциями.
Написание текстовых блоков OPTION в формате JSON - это красивая академическая идея для примеров.
Например, управление и поддержка вот таких настроек выгрузки одного из вариантов самого обычного кассового чека -
это попа полная (и там ещё 12 вложенных списков потом подключается со своими тегами): :(

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

Atol:J_Items      Equate('{{"Name":"barcodeType","JsonName":"barcodeType"},' & |
                         '{{"Name":"pictureNumber","JsonName":"pictureNumber"},' & |                          
                         '{{"Name":"infoDiscountAmount","JsonName":"infoDiscountAmount"},' & | 
                         '{{"Name":"measurementUnit","JsonName":"measurementUnit"},' & | 
                         '{{"Name":"paymentMethod","JsonName":"paymentMethod"},' & | 
                         '{{"Name":"paymentObject","JsonName":"paymentObject"},' & | 
                         '{{"Name":"nomenclatureCode","JsonName":"nomenclatureCode"},' & | 
                         '{{"Name":"additionalAttribute","JsonName":"additionalAttribute"},' & |
                         '{{"Name":"exciseSum","JsonName":"exciseSum"},' & | 
                         '{{"Name":"countryCode","JsonName":"countryCode"},' & | 
                         '{{"Name":"customsDeclaration","JsonName":"customsDeclaration"},' & | 
                         '{{"Name":"userParam3","JsonName":"userParam3"},' & | 
                         '{{"Name":"userParam4","JsonName":"userParam4"},' & | 
                         '{{"Name":"userParam5","JsonName":"userParam5"},' & | 
                         '{{"Name":"userParam6","JsonName":"userParam6"},' & |
                         '{{"Name":"markingCode","JsonName":"markingCode"},' & | ! GROUP / QUEUE
                         '{{"Name":"imcParams","JsonName":"imcParams"},' & |
                         '{{"Name":"agentInfo","JsonName":"agentInfo"},' & |
                         '{{"Name":"supplierInfo","JsonName":"supplierInfo"},' & |
                         '{{"Name":"productCodes","JsonName":"productCodes"},' & |
                         '{{"Name":"industryInfo","JsonName":"industryInfo"},' & |
                         '{{"Name":"customParameters","JsonName":"customParameters"},' & |
                         '{{"Name":"doubleWidth","JsonName":"doubleWidth","IsBool":true,"IgnoreFalse":true},'        & |
                         '{{"Name":"doubleHeight","JsonName":"doubleHeight","IsBool":true,"IgnoreFalse":true},'      & |
                         '{{"Name":"printText","JsonName":"printText","IsBool":true,"IgnoreFalse":true},'            & |
                         '{{"Name":"piece","JsonName":"piece","IsBool":true,"IgnoreFalse":true},'                    & |
                         '{{"Name":"additionalAttributePrint","JsonName":"additionalAttributePrint","IsBool":true},' & | 
                         '{{"Name":"print","JsonName":"print","IsBool":true},'                   & | 
                         '{{"Name":"storeInJournal","JsonName":"storeInJournal","IsBool":true},' & | ! для Default: true
                         '{{"Name":"imcType","JsonName":"imcType"},'  & |
                         '{{"Name":"itemEstimatedStatus","JsonName":"itemEstimatedStatus"},'  & |
                         '{{"Name":"imcModeProcessing","JsonName":"imcModeProcessing","IgnoreZero":false},'  & |
                         '{{"Name":"itemFractionalAmount","JsonName":"itemFractionalAmount"},'  & |
                         '{{"Name":"imcBarcode","JsonName":"imcBarcode"},'      & |
                         '{{"Name":"itemQuantity","JsonName":"itemQuantity"},'  & |                                
                         '{{"Name":"itemUnits","JsonName":"itemUnits"},'        & |
                         '{{"Name":"itemInfoCheckResult","JsonName":"itemInfoCheckResult"},' & |
                         '{{"Name":"imcCheckFlag","JsonName":"imcCheckFlag","IsBool":true,"IgnoreFalse":true},'           & |
                         '{{"Name":"imcCheckResult","JsonName":"imcCheckResult","IsBool":true,"IgnoreFalse":true},'       & | 
                         '{{"Name":"imcStatusInfo","JsonName":"imcStatusInfo","IsBool":true,"IgnoreFalse":true},'         & |
                         '{{"Name":"imcEstimatedStatusCorrect","JsonName":"imcEstimatedStatusCorrect","IsBool":true,"IgnoreFalse":true},' & |
                         '{{"Name":"ecrStandAloneFlag","JsonName":"ecrStandAloneFlag","IsBool":true,"IgnoreFalse":true},' & |
                         '{{"Name":"payingAgent","JsonName":"payingAgent"},' & |
                         '{{"Name":"receivePaymentsOperator","JsonName":"receivePaymentsOperator"},' & |                          
                         '{{"Name":"moneyTransferOperator","JsonName":"moneyTransferOperator"},'     & |                          
                         '{{"Name":"agentsPrint","JsonName":"agentsPrint","IsBool":true},' & |   ! для Default: true
                         '{{"Name":"agentDataPrint","JsonName":"agentDataPrint","IsBool":true},' & |
                         '{{"Name":"supplierPrint","JsonName":"supplierPrint","IsBool":true},' & |  ! для Default: true
                         '{{"Name":"supplierVatinPrint","JsonName":"supplierVatinPrint","IsBool":true},' & |
                         '{{"Name":"industryAttribute","JsonName":"industryAttribute"},' & |
                         | ! + добавляется на этапе выполнения
        '{{"Name":"taxes","JsonName":"taxes"},'                        & | 
        '{{"Name":"industryInfo","JsonName":"industryInfo"},'          & |        
        '{{"Name":"customParameters","JsonName":"customParameters"},'  & |         
        '{{"Name":"salesNotice","JsonName":"salesNotice"},'            & |         
        '{{"Name":"clientInfo","JsonName":"clientInfo"},'              & |
        '{{"Name":"companyInfo","JsonName":"companyInfo"},'            & |
        '{{"Name":"agentInfo","JsonName":"agentInfo"},'                & |
        '{{"Name":"supplierInfo","JsonName":"supplierInfo"},'          & |
        '{{"Name":"operationInfo","JsonName":"operationInfo"},'        & |        
        '{{"Name":"taxationType","JsonName":"taxationType"},'          & |
        '{{"Name":"paymentsPlace","JsonName":"paymentsPlace"},'        & |
        '{{"Name":"paymentsAddress","JsonName":"paymentsAddress"},'    & |
        '{{"Name":"machineNumber","JsonName":"machineNumber"},'        & |        
        '{{"Name":"electronically","IsBool":true,"IgnoreFalse":true},' & |
        '{{"Name":"ignoreNonFiscalPrintErrors","JsonName":"ignoreNonFiscalPrintErrors","IsBool":true,"IgnoreFalse":true},' & |
        '{{"Name":"validateMarkingCodes","JsonName":"validateMarkingCodes","IsBool":true,"IgnoreFalse":true},' & |                         
                         '{{"Name":"preItems","JsonName":"preItems","instance":'    & Instance(Self.qPreItems, Thread()) & '},' & |
                         '{{"Name":"postItems","JsonName":"postItems","instance":'  & Instance(Self.qPostItems,Thread()) & '},' & |
                         '{{"Name":"items","JsonName":"items","instance":'          & Instance(qItems,         Thread()) & '},' & |
                         '{{"Name":"payments","JsonName":"payments","instance":'    & Instance(qPayments,      Thread()) & '}')
Учитывая сложившийся в нашем общении принцип отрицания всего - я предложу самый простой вариант
(как идею для рассмотрения):

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

  Self.OptClear('Набор1')
  Self.OptSet('Набор1')
  Self.OptAdd('"Name":"industryAttribute","JsonName":"industryAttribute"')
  Self.OptAdd('"Name":"payingAgent","JsonName":"payingAgent"')
  
  Self.OptClear('Набор2')
  Self.OptSet('Набор2')  
  Self.OptAdd('"Name":"userParam3","JsonName":"userParam3,"IsBool":true"')
  
  Object.ToGroup(gResponse,,'Набор1')  ! Первые два символа не '[{{'
  Json.ToGroup(JsonStr,NameObject,GroupResponse,'Набор2')
  
  Self.OptFree()  

cJSON: Предложения по развитию проекта

Добавлено: 19 Сентябрь 2024, 8:07
finsoftrz
Не знаю, будет ли полезно. Всякие установки для структур group и queue можно передавать через атрибут name. По моему, у Брюса Джонсона такое видел. Получается что-то наподобии пользовательских опций словаря. Выглядит неплохой идеей, чтобы разделять данные и код.

cJSON: Предложения по развитию проекта

Добавлено: 19 Сентябрь 2024, 8:26
Игорь Столяров
finsoftrz писал(а): 19 Сентябрь 2024, 8:07 По моему, у Брюса Джонсона
Видимо Брюс Джонс тоже демонстрировал свои идеи на концептуальных академических примерах.
Потому что в Clarion ограничение длины имени переменной - 100 символов. Любым способом.

Ну и плюс сюда же технологическое ограничение Clarion с потерей регистра имени полей функцией WHO().
Этого не увидел даже тот "Джонс" который справку Clarion делал и проверял ... ;)

cJSON: Предложения по развитию проекта

Добавлено: 19 Сентябрь 2024, 8:44
finsoftrz
Я просто привёл идею для размышлений. Никто не запрещает, например, вводить именованные наборы правил и т.п. Главный смысл в отделении данных от кода, насколько возможно, что, очевидно, упрощает контроль и поддержку проекта. Смотрите сами. Я использую cjson довольно мало, хватает базового функционала. Если потребуется больше, то оберну в свой класс.

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 12:31
Дед Пахом
"Учитывая тот факт" (c) что опции в формате json, можно манипулировать не большой строкой опций, а json объектом. Для примера:

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

OptionsTest              PROCEDURE()
jOptions                        &cJSON, AUTO
  MAP
    AddFieldOptions(cJSON pjOptions, STRING pFieldName, STRING pRawJsonOptions)
  END
  CODE
  !- создаём массив опций
  jOptions &= json::CreateArray()

  !- добавляем опции для каждого поля (без фигурных скобок)
  jOptions.AddFieldOptions('barcodeType', '"JsonName":"barcodeType"')
  jOptions.AddFieldOptions('pictureNumber', '"JsonName":"pictureNumber"')
  jOptions.AddFieldOptions('infoDiscountAmount', '"JsonName":"infoDiscountAmount"')
  !...
  jOptions.AddFieldOptions('validateMarkingCodes', '"JsonName":"validateMarkingCodes","IsBool":true,"IgnoreFalse":true')
  jOptions.AddFieldOptions('preItems', '"JsonName":"preItems","instance":'& Instance(Self.qPreItems, Thread()))

  !- передаём в json::CreateObject или json::CreateArray:
  jObject &= json::CreateObject(gCountry,,jOptions.ToString())

  !- чистим
  jOptions.Delete()

AddFieldOptions               PROCEDURE(cJSON pjOptions, STRING pFieldName, STRING pRawJsonOptions)
  CODE
  pjOptions.AddItemToArray(json::CreateRaw(printf('{{"Name":"%s", %s}', pFieldName, pRawJsonOptions)))

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 13:54
Игорь Столяров
Спасибо ! Но здесь нужно сразу ответить на главный вопрос:
Пример позволяет упростить работу или демонстрирует возможности Clarion по использованию методов с одинаковыми именами ?
Я склоняюсь ко второму варианту. ;)

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 16:01
finsoftrz
Игорь Столяров писал(а): 20 Сентябрь 2024, 13:54 Спасибо ! Но здесь нужно сразу ответить на главный вопрос:
Пример позволяет упростить работу или демонстрирует возможности Clarion по использованию методов с одинаковыми именами ?
Я склоняюсь ко второму варианту. ;)
Точно, Игорь, Вы нас раскусили. Стили придумали лентяи! :lol:

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 16:21
Дед Пахом
Игорь Столяров писал(а): 20 Сентябрь 2024, 13:54 Спасибо ! Но здесь нужно сразу ответить на главный вопрос:
Пример позволяет упростить работу или демонстрирует возможности Clarion по использованию методов с одинаковыми именами ?
Я склоняюсь ко второму варианту. ;)
Честно говоря, не понял вопроса. Пример демонстрирует альтернативный метод использования опций.

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 16:25
Игорь Столяров
finsoftrz писал(а): 20 Сентябрь 2024, 16:01 Стили придумали
Здесь немного иное ... но всё равно спасибо. :)

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 16:27
Игорь Столяров
Дед Пахом писал(а): 20 Сентябрь 2024, 16:21 Пример демонстрирует альтернативный метод использования опций.
Да ! Некий интерфес создания опций. Только он не упрощает работу с опциями. ;)

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 17:13
Дед Пахом
А ваш пример упрощает? Смею заметить, что оба примера практически идентичны, только ваш умозрительный, а мой готов к использованию.

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 17:47
Игорь Столяров
.

cJSON: Предложения по развитию проекта

Добавлено: 20 Сентябрь 2024, 21:20
Дед Пахом
К сожалению, уже на первой странице тема ожидаемо превратилась в мешанину не связанных между собой вопросов.