Страница 1 из 1
cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 7:02
Игорь Столяров
Добрый день !
В классе cJSON есть правило (option) для честного случая: {"IgnoreFalse":true/false}
Но очень хочется для работы полноценное правило {"IgnoreBool":"true"/"false"}
(ну или хотя бы дополнение до него {"IgnoreTrue":true/false})
Поясню. Сейчас сервисы и оборудование имеют в структуре обмена массу флагов со значением DEFAULT = true.
Поэтому даже если флаг не используется в каком-то запросе (у меня таких в структуре Queue: 42 !) нужно присваивать
ему значение Flag = True перед записью в пакет ... Я не против, проблема по которой я сейчас пишу - в другом.
В рультате получается пакет JSON в котором огромное кол-во флагов BOOL со значением "true" и даже сейчас уже
не понятно какие из них реально передаются для управления запросом, а какие отрабатывают подтверждение
установки "DEFAULT = true" (и по здравой логике их там быть не должно, т.к. не нужно изменять предустановку).
Если я вообще исключу флаг из пакета - то не смогу изменять для записей его значение на "false" при необходимости.

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

cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 9:40
finsoftrz
Игорь, Вам пора Михаилу зарплату начинать платить.

cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 9:57
Игорь Столяров
finsoftrz писал(а): 15 Сентябрь 2024, 9:40
Игорь, Вам пора Михаилу зарплату начинать платить.
Если Вы интересуетесь уровнями зарплат в IT, то там на втором месте: QA-инженер (тестировщик продукта).
Но я вообще без претензий ... Догадываетесь сколько времени занимает проверка на всех режимах ?

cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 10:14
finsoftrz
Я так понимаю, Вы это из альтруизма все делаете.

cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 11:14
Игорь Столяров
finsoftrz писал(а): 15 Сентябрь 2024, 10:14
Вы это из альтруизма все делаете
Неть ! Мною движет непреодолимое желание создавать работающие проекты, а не бесполезные посты в форуме !

cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 11:26
finsoftrz
Смотрите сами. Всегда удивляло, кода некоторые люди думают, что их желания еще кому-то интересны.

cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 11:31
Дед Пахом
Ага, завтра добавим опцию IgnoreIfNameContainsZ, послезавтра IgnoreIfRetrogradnyMercury...
Колбэк FindCB вам в руки:
Код: Выделить всё
rh.FindCB PROCEDURE(STRING fldName, *typCJsonFieldRule rule)
CODE
IF rule.IsBool
!- игнор всех bool.
rule.Ignore = TRUE
END
cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 11:50
Игорь Столяров
Дед Пахом писал(а): 15 Сентябрь 2024, 11:31
Колбэк FindCB вам в руки:
Игнорировать все Bool несложно, т.к. их невозможно вообще выгрузить без принудительной установки "IsBool":true

А вот как убрать выгрузку конкретного тега с именем "Flag123" только если его значение true ? Вот вопрос !
Если для реализации полноценной работы с логическими значениями нужно обязательно делать отдельную выгрузку
для каждого запроса с настройками тегов - я не против. Точнее уже привык. Понять бы как ... Спасибо !
cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 12:10
Дед Пахом
Игорь Столяров писал(а): 15 Сентябрь 2024, 11:50
А вот как убрать выгрузку конкретного тега с именем "Flag123" только если его значение true ? Вот вопрос !
Принимая во внимание факт, что во время выполнения FindCB очередь с данными в актуальном состоянии, то можно как-то так:
Код: Выделить всё
IF LOWER(fldName) = 'flag123'
rule.Ignore = CHOOSE(DataQueue.Flag123 = TRUE)
END
cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 13:33
Игорь Столяров
Спасибо, работает ! Но для каждого запроса - свой отделный метод с настройками полей в rh.FindCB().

cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 14:55
Игорь Столяров
Дед Пахом писал(а): 15 Сентябрь 2024, 11:31
Ага, завтра добавим опцию IgnoreIfNameContainsZ
Вы всё предвидели ! Соглашусь, что опция {"IgnoreValue":ЗНАЧЕНИЕ} была бы весьма кстати !
Не стоит беспокоиться, я сам знаю как идти в rh.FindCB() ...

cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 17:26
Дед Пахом
Игорь Столяров писал(а): 15 Сентябрь 2024, 13:33
Но для каждого запроса - свой отделный метод с настройками полей в rh.FindCB().
Можно всё в один запихать наверно.
cJSON: И где логика ?
Добавлено: 15 Сентябрь 2024, 18:33
Игорь Столяров
Спасибо, верите в меня ! Я не сдаюсь !
Подскажите пожалуйста, можем ли мы в FindCB() определить места полей с одинаковыми названиями ?
Я вижу оба поля, но как опредеить какое именно ? Пример:
Код: Выделить всё
TestJSON Procedure
rh Class(TCJsonRuleHelper)
FindCB Procedure(String pFldName, *typCJsonFieldRule pRule), Derived
end
Root &cJson
Json cJSONFactory
Q_Flags Queue,Type
Flag1 Bool
Flag2 Bool
end
Packet Group
PrePrint &Q_Flags
PostPrint &Q_Flags
! много одинаковых списков строк :(
end
qPrePrint Queue(Q_Flags).
qPostPrint Queue(Q_Flags).
Code
qPrePrint.Flag1 = False
qPrePrint.Flag2 = True
Add(qPrePrint)
qPostPrint.Flag1 = True
qPostPrint.Flag2 = False
Add(qPostPrint)
Packet.PrePrint &= qPrePrint
Packet.PostPrint &= qPostPrint
Root &= json::CreateObject(Packet,,'[{{"Name":"*","RuleHelper":' & Address(rh) & '},' & |
'{{"Name":"PrePrint","instance":' & Instance(Packet.PrePrint, Thread()) & '},' & |
'{{"Name":"PostPrint","instance":' & Instance(Packet.PostPrint,Thread()) & '},' & |
'{{"Name":"Flag1","IsBool":true},' & |
'{{"Name":"Flag2","IsBool":true}]')
If Not Root &= Null
Message(Root.ToString(True))
SetClipBoard(Root.ToString(True))
Root.Delete()
end
rh.FindCB Procedure(String pFldName, *typCJsonFieldRule pRule)
Code
If Lower(pFldName) = 'flag2'
Message(Packet.PrePrint.Flag2 & ' - ' & Packet.PostPrint.Flag2 & '|' & pRule.FieldNumber)
! Как узнать
! pRule.Ignore = Choose(Packet.PrePrint.Flag2 = True)
! или
! pRule.Ignore = Choose(Packet.PostPrint.Flag2 = True)
end
cJSON: И где логика ?
Добавлено: 16 Сентябрь 2024, 12:33
Дед Пахом
Игорь Столяров писал(а): 15 Сентябрь 2024, 18:33
Подскажите пожалуйста, можем ли мы в FindCB() определить места полей с одинаковыми названиями ?
Учитывая, что поля перебираются последовательно, можно как-то так:
Код: Выделить всё
rh.FindCB Procedure(String pFldName, *typCJsonFieldRule pRule)
Code
!- запомним имя обрабатываемой очереди
case Lower(pFldName)
of 'preprint' orof 'postprint'
self.ProcessingQueueName = Lower(pFldName)
end
If Lower(pFldName) = 'flag2'
if self.ProcessingQueueName = 'preprint'
pRule.Ignore = Choose(Packet.PrePrint.Flag2 = True)
elseif self.ProcessingQueueName = 'postprint'
pRule.Ignore = Choose(Packet.PostPrint.Flag2 = True)
end
end
Можно ещё проще:
Код: Выделить всё
rh.FindCB Procedure(String pFldName, *typCJsonFieldRule pRule)
Code
!- запомним обрабатываемую очередь
case Lower(pFldName)
of 'preprint'
self.flags &= Packet.PrePrint
of 'postprint'
self.flags &= Packet.PostPrint
end
If Lower(pFldName) = 'flag2'
pRule.Ignore = Choose(self.flags.Flag2 = True)
end
cJSON: И где логика ?
Добавлено: 16 Сентябрь 2024, 13:03
Игорь Столяров
Спасибо ! Идея понятна - заголовок группы всегда идёт раньше полей группы.
Этот вариант буду пробовать - другого выхода сейчас нет.
