Страница 7 из 18
cJSON: Формат полей для вложенных структур
Добавлено: 04 Декабрь 2022, 17:23
Игорь Столяров
Спасибо за ответ.
1. Если честно - то я не умею пользоваться DebugLog, наверно это только в C11 ?
Не надо Message() ! Если заданы, но не корректы Options - верните результат False, мы сами разберёмся с проблемой.
Иначе получатся, что метод выполняется в непредсказуемой форме, но с положительным результатом !
3. Логично, но ситуация развивается несколько иначе ...

В отсутствие п.4., New() выполняет вспомогательная процедура из класса json::LoadFile(), а список адресов
выделенной памяти ведёт (и выполняет их Dispose()) - уже прикладная программа ...
И да, я знаю, что этот вопрос можно решить через субклассинг.
4. Уже за это - спасибо.
Сейчас загрузку файлов вообще делаем вручную, а выгрузку костылим через IsStringRef:
Код: Выделить всё
! Загрузить из файла строку в BASE64
Class.IsLoadFile Procedure(String xFilename) !, *String
xContent &String
xBuffer &IDynStr
Code
xContent &= json::LoadFile(xFilename)
If Not (xContent &= Null)
xBuffer &= NewDynStr()
If Not (xBuffer &= Null) then xBuffer.Cat(ToBase64(xContent)) ! Содержимое файла в BASE64
Dispose(xContent) ! Пересоздать строку
xContent &= New(String(xBuffer.StrLen()))
xBuffer.CopyTo(xContent)
xBuffer.Kill; DisposeDynStr(xBuffer)
end
end
Return xContent
cJSON: Формат полей для вложенных структур
Добавлено: 04 Декабрь 2022, 17:33
Дед Пахом
Под DebugLog я имею в виду результат работы api функции OutputDebugString, который (результат) можно посмотреть утилитой DebugView (SysInternals). На сайте SysInternals много чего интересного есть.
cJSON: Формат полей для вложенных структур
Добавлено: 05 Декабрь 2022, 16:58
Игорь Столяров
Добрый день !
Подскажите пожалуйста, я правильно понимаю, что эти выражения вернут абсолютно одно и то же ?
(содержание JSON строки в кодировке UTF8)
Код: Выделить всё
Root &= json::CreateString(...)
If Not (Root &= Null)
Message( json::ToUtf8(Root.ToString()) ) ! 1 вариант
Message( Root.ToUtf8() ) ! 2 вариант
Root.Delete()
end

cJSON: Формат полей для вложенных структур
Добавлено: 05 Декабрь 2022, 17:10
Дед Пахом
Вообще-то могут вернуть разное, например, если есть Raw строки, то они не будут перекодированы в случае Root.ToUtf8().
cJSON: Формат полей для вложенных структур
Добавлено: 05 Декабрь 2022, 17:19
Игорь Столяров
Спасибо. Это понятно - вопросы с экранированием и кодировкой RAW строк должны решаться отдельно.
cJSON: Формат полей для вложенных структур
Добавлено: 05 Декабрь 2022, 23:25
Игорь Столяров
Не нравятся классу пустые группы, причём даже без "Ignore".
Код: Выделить всё
Class.MyTest Procedure()
gPack Group
Title Group
CreateDate String(10)
CreateTime String( 8)
Counters Group
end
end
end
Code
Root &= json::CreateObject(gPack)
Message(Root.ToUTF8())
Root.Delete()
Результат с дублированием наименования группы:
Код: Выделить всё
{
"title": {
"createdate": "",
"createtime": "",
"counters": {}
},
"counters": {}
}
cJSON: Формат полей для вложенных структур
Добавлено: 06 Декабрь 2022, 8:47
Игорь Столяров
Наверно вопрос из той же серии, что и предыдущий. Но уже без пустых групп.
Если позволите - я опубликую пример для тестирования:
Код: Выделить всё
Class.MyTest Procedure()
Root &cJson
gPack Group
Title Group
CreateDate String(10)
CreateTime String( 8)
TimeStamp String(25)
PackID String(36)
DateStart String(10)
DateEnd String(10)
Terminal Long
Action Byte
ExportGraph Bool
Remark CString(251)
Enterprise CString(251)
Otdel CString(251)
Operator CString(251)
Counters Group
CountShet Long
CountKass Long
CountBank Long
CountTrNakl Long
CountHistory Long
CountFall Long
CountPlat Long
CountClient Long
CountTovar Long
end
end
Documents Group
Doc1 &Queue
Doc2 &Queue
Doc3 &Queue
Doc4 &Queue
Doc5 &Queue
Doc6 &Queue
Doc7 &Queue
Doc8 &Queue
Doc9 &Queue
end
end
qD1 Queue.
qD2 Queue.
qD3 Queue.
qD4 Queue.
qD5 Queue.
qD6 Queue.
qD7 Queue.
qD8 Queue.
qD9 Queue.
Code
Root &= json::CreateObject(gPack,,'[' & |
'{{"name":"Doc1","instance":' & Instance(qD1, Thread()) & '},' & |
'{{"name":"Doc2","instance":' & Instance(qD2, Thread()) & '},' & |
'{{"name":"Doc3","instance":' & Instance(qD3, Thread()) & '},' & |
'{{"name":"Doc4","instance":' & Instance(qD4, Thread()) & '},' & |
'{{"name":"Doc5","instance":' & Instance(qD5, Thread()) & '},' & |
'{{"name":"Doc6","instance":' & Instance(qD6, Thread()) & '},' & |
'{{"name":"Doc7","instance":' & Instance(qD7, Thread()) & '},' & |
'{{"name":"Doc8","instance":' & Instance(qD8, Thread()) & '},' & |
'{{"name":"Doc9","instance":' & Instance(qD9, Thread()) & '}]')
If Not (Root &= Null)
json::SaveFile('Test.json',Root.ToUtf8())
Root.Delete()
end
Результат:
Код: Выделить всё
{
"title": {
"createdate": "",
"createtime": "",
"timestamp": "",
"packid": "",
"datestart": "",
"dateend": "",
"terminal": 0,
"action": 0,
"exportgraph": 0,
"remark": "",
"enterprise": "",
"otdel": "",
"operator": "",
"counters": {
"countshet": 0,
"countkass": 0,
"countbank": 0,
"counttrnakl": 0,
"counthistory": 0,
"countfall": 0,
"countplat": 0,
"countclient": 0,
"counttovar": 0
}
},
"doc8": [],
"doc9": []
}
Вопрос: А где Doc1 ... Doc7 и чем они собственно отличаются от Doc8 ... Doc9 ? Где группа Documents ?
Спасибо за проверку.

cJSON: Формат полей для вложенных структур
Добавлено: 06 Декабрь 2022, 9:18
Admin
Сломали класс. Старый работает как доктор прописал
cJSON: Формат полей для вложенных структур
Добавлено: 06 Декабрь 2022, 9:29
Игорь Столяров
Admin писал(а): 06 Декабрь 2022, 9:18Сломали класс
Не согласный я с этим !

Элементарные "группка + списочек" везде работают.
Но не все пошли дальше. А те кто пойдут - сразу увидят тоже самое, что и я.
Сами структуры JSON - очень красивые в своей идее (где блин комментарии только ?).
Класс - великолепный, огромное спасибо, что у нас есть возможность работы с JSON
(крупным производителям библиотек кучка кларионистов давно не интересна).
Просто нужно немного допилить возникающие вопросы - это нормальный рабочий процесс.

cJSON: Формат полей для вложенных структур
Добавлено: 06 Декабрь 2022, 17:10
Дед Пахом
Игорь Столяров писал(а): 05 Декабрь 2022, 23:25
Не нравятся классу пустые группы, причём даже без "Ignore".
Дошли руки пока только до этого, вроде починил.
Заходит однажды тестировщик в бар.
Забегает в бар.
Пролезает в бар.
Танцуя, проникает в бар.
Крадется в бар.
Врывается в бар.
Прыгает в бар
и заказывает:
кружку пива,
2 кружки пива,
0 кружек пива,
999999999 кружек пива,
ящерицу в стакане,
–1 кружку пива,
qwertyuip кружек пива.
cJSON: Формат полей для вложенных структур
Добавлено: 06 Декабрь 2022, 17:18
Дед Пахом
После всего этого в бар заходит первый реальный пользователь и спрашивает, где тут туалет. Бар взрывается.
cJSON: Формат полей для вложенных структур
Добавлено: 06 Декабрь 2022, 17:21
Игорь Столяров
Выдайте пжалуйста тестировщку ещё INC файл для комплекта !
cJSON: Формат полей для вложенных структур
Добавлено: 06 Декабрь 2022, 17:22
Дед Пахом
Виноват...
cJSON: Формат полей для вложенных структур
Добавлено: 07 Декабрь 2022, 0:36
Дед Пахом
С вложенными группами такой геморрой. Проверяйте.
Тем временем я сделал поиск по json (JSON Path). Примеры:
Код: Выделить всё
resCount = jRoot.FindPathContext('$ [ "store" ][ * ][ "price" ]', output) ! все цены в магазине
resCount = jRoot.FindPathContext('$ [ "store" ]["book"][2:3][ "price" ]', output) ! цены на 2-ю и 3-ю книги
resCount = jRoot.FindPathContext('$ [ "store" ]["book"][(@.length)][ "price" ]', output) ! цена на последнюю в списке книгу
resCount = jRoot.FindPathContext('$ [ "store" ]["book"][?(@.price << 10)]', output) ! все книги дешевле 10 копеек
resCount = jRoot.FindPathContext('$["store"]["book"][1,4]["price"]', output) ! цены на 1-ю и 4-ю книги
resCount = jRoot.FindPathContext('$[..][category,isbn]', output) !- все категории и все номера isbn
resCount = jRoot.FindPathContext('$[store][book][?(instring("Tolkien",@.author,1,1)>0)]', output) !- все книги Толкина
resCount = jRoot.FindPathContext('$[store][book][?(instring("Tolkien",@.author,1,1)>0)][price]', output) !- все цены на книги Толкина
Сам JSON:
Код: Выделить всё
jRoot &= jParser.Parse( '' |
& '{{ "store": {{' |
& ' "book": [ ' |
& ' {{ "category": "reference",' |
& ' "author": "Nigel Rees",' |
& ' "title": "Sayings of the Century",' |
& ' "price": 8.95' |
& ' },' |
& ' {{ "category": "fiction",' |
& ' "author": "Evelyn Waugh",' |
& ' "title": "Sword of Honour",' |
& ' "price": 12.99' |
& ' },' |
& ' {{ "category": "fiction",' |
& ' "author": "Herman Melville",' |
& ' "title": "Moby Dick",' |
& ' "isbn": "0-553-21311-3",' |
& ' "price": 8.99' |
& ' },' |
& ' {{ "category": "fiction",' |
& ' "author": "J. R. R. Tolkien",' |
& ' "title": "The Lord of the Rings",' |
& ' "isbn": "0-395-19395-8",' |
& ' "price": 22.99' |
& ' }' |
& ' ],' |
& ' "bicycle": {{' |
& ' "color": "red",' |
& ' "price": 19.95' |
& ' }' |
& ' }' |
& '}' |
)
Но это когда Игорь скажет, что новая версия работает.
cJSON: Формат полей для вложенных структур
Добавлено: 07 Декабрь 2022, 8:47
Игорь Столяров
Дед Пахом писал(а): 07 Декабрь 2022, 0:36
С вложенными группами такой геморрой.
Так обмен информационных систем через пакеты структурированных данных - это и есть JSON !

Все мои тесты работают. Убрал многочисленные костыли в реальном коде - теперь красота страшная !
Раньше пакет формировался как текстовый файл со структурой JSON в &IDynStr - экранов 40 кода.
Теперь задали структуру, заполнили и выгрузили одной командой (опции на экран). Это даже детям понятно.
Сегодня переходим к экспорту списков содержащих список внутри списка ... Интересно аж жуть !
