Страница 4 из 18
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 13:05
Дед Пахом
Не такая уж эта комбинация и многоходовая.
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 13:46
Игорь Столяров
Можно сказать и так. С точки зрения программиста С, список списков указателей - вообще обычное дело.
Код работает - здесь скорей вопрос сворачивания повторяющихся рутинных операций с указателями в метода класса.
Ну и сама операция перадачи файла через тег - вполне востребована. Это не только документы, но картинки, сертификаты и т.д.
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 15:15
Игорь Столяров
Что бы не плодить темы в форуме - можно я здесь спрошу ?
Нужно передать в теге русский текст в UTF8.
Если это обычная строка, то метод json::CreateObject() штатно сам выполнит экранирование.
Но если {"Name":"Tag","IsRaw":True} - то я должен экранировать содержание тега после кодирования в UTF8 самостоятельно ?
А как (метод) ? Заранее спасибо - сам не нашёл ...
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 15:46
Дед Пахом
json::ToUtf8() должна помочь.
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 17:07
Игорь Столяров
Дед Пахом писал(а): ↑24 Ноябрь 2022, 15:46
json::ToUtf8() должна помочь.
Не пугайте меня пожалуйста ! ToUTF8() - это обычная конвертация ANSI -> UTF8.
Код: Выделить всё
MyTest Procedure()
gMessage Group
S1 cString(21)
S2 cString(21)
end
Params &cJson
Code
gMessage.S1 = json::ToUtf8( '{{\')
gMessage.S2 = json::ToUtf8('"{{\"')
Params &= json::CreateObject(gMessage,,'[{{"name":"S2","isRaw":true}]')
Результат:
{
"s1": "{\\",
"s2": "{\" ! <-- Это ошибка - нужно применять экранирование к содержанию тега
}
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 19:03
Дед Пахом
Не знаю зачем, но (если я понял задачу) как-то так:
Код: Выделить всё
jTag &= json::CreateString('...') !- или другой какой json::Create
grp.tag = jTag.ToString()
jTag.Delete()
Params &= json::CreateObject(grp,,'[{{"name":"tag","isRaw":true}]')
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 19:22
Игорь Столяров
Спасибо. Это просто нужно знать и уметь работать с &cJson. Да, если сделать вот так:
Код: Выделить всё
gMessage.S1 = json::ToUtf8('{{\')
jTag &= json::CreateString(json::ToUtf8('{{\'))
gMessage.S2 = jTag.ToString()
jTag.Delete()
Params &= json::CreateObject(gMessage,,'[{{"name":"S2","isRaw":true}]')
то получается нужный результат:
{
"s1": "{\\",
"s2": "{\\"
}
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 20:09
Игорь Столяров
Я честно пытаюсь думать. Но можно крайний раз спросить ?
А как в этом варианте выгрузить массив (строка без кавычек) - ради этого ведь и делался "IsRaw" ...
Код: Выделить всё
jTag &= json::CreateRaw(json::ToUtf8('[{{"value":"\ЖПД"}]')) ! Не экранируется "\"
gMessage.S2 = jTag.ToString()
jTag.Delete()
Params &= json::CreateObject(gMessage,,'[{{"name":"S2","isRaw":true}]')
В штатном классе JSON есть метод экранирования и всё было просто:
Код: Выделить всё
gMessage.S2 = EscapeString(json::ToUtf8('[{{"value":"\ЖПД"}]')) ! Всё OK !
Params &= json::CreateObject(gMessage,,'[{{"name":"S2","isRaw":true}]')
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 20:18
Дед Пахом
Ну барин... тут без CreateObject+AddStringToObject вряд ли обойтись. Я так понимаю, Вы весь json пихаете в строку, а затем IsRaw и вуаля.
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 20:29
Игорь Столяров
Дед Пахом писал(а): ↑24 Ноябрь 2022, 20:18
CreateObject+AddStringToObject вряд ли обойтись
Не. Это ручное формирование JSON и прямой путь в дурку. Бум думать дальше, выход есть всегда ...
cJSON: Формат полей для вложенных структур
Добавлено: 24 Ноябрь 2022, 21:16
Игорь Столяров
Игорь сделал выгрузку массива в строке !
Код: Выделить всё
gMessage.S2 = '[{{"value":' & Self.EscToUtf8('\РУС') & '}]'
Params &= json::CreateObject(gMessage,,'[{{"name":"S2","isRaw":true}]')
где (по Вашей рекомендации):
Код: Выделить всё
MyClass.EscToUtf8 Procedure(String xValue) !, String
Code
If Not Self.jTag &= Null then Self.jTag.Delete(). ! И тоже самое в MyClass.Kill()
Self.jTag &= json::CreateString(json::ToUtf8(xValue))
Return Self.jTag.ToString()
Только пришлось добавить в класс jTag - т.к. на момент выхода из метода jTag должен существовать.
cJSON: Формат полей для вложенных структур
Добавлено: 25 Ноябрь 2022, 8:56
Игорь Столяров
Сделал метод для загрузки в тег файла, как доступная мне альтернатива опции "IsFile". Стало светлее.
Код: Выделить всё
! Загрузить файл в строку BASE64
MyClass.IsLoadFile Procedure(String xFilename) !, *String
xContent &String
xBuffer &IDynStr
Code
xContent &= json::LoadFile(xFilename)
If Not (xContent &= Null)
xBuffer &= NewDynStr()
If Not (xBuffer &= Null)
xBuffer.Cat(ToBase64(xContent)) ! Содержимое файла в BASE64
Dispose(xContent) ! Пересоздать строку
xContent &= New(String(xBuffer.StrLen()))
xBuffer.CopyTo(xContent)
xBuffer.Kill ! <<-- Добавил !!!
DisposeDynStr(xBuffer)
end
end
Return xContent
Вопрос: подскажите пожалуйста, а какая сейчас предлагается технология для загрузки файлов ?
Вот получил я c сервиса ответ в виде JSON строки. В ней массив тегов с документами (в кодировке BASE64).
Сейчас порядка 100 KByte каждый тег (но заявлено до 10 MByte). Как их оттуда получить ? В поле с "IsStringRef" ?
Спасибо !
cJSON: Формат полей для вложенных структур
Добавлено: 25 Ноябрь 2022, 11:07
Дед Пахом
Пока не забыл: как писал Диего Б., IDynStr надо очищать перед DisposeDynStr:
Как их оттуда получить ? В поле с "IsStringRef" ?
Как-то так:
Код: Выделить всё
jFileContents &= jRoot.FindObjectItem('file1')
refFileContent &= jFileContents.GetStringRef()
SaveFile('file1.txt', FromBase64(refFileContent))
cJSON: Формат полей для вложенных структур
Добавлено: 25 Ноябрь 2022, 11:45
Игорь Столяров
Дед Пахом писал(а): ↑25 Ноябрь 2022, 11:07
IDynStr надо очищать перед DisposeDynSt
Век живи - век учись ... Спасибо, теперь всегда буду очищать.
С загрузкой файла из тега тоже всё понятно ...
cJSON: Формат полей для вложенных структур
Добавлено: 26 Ноябрь 2022, 10:00
Игорь Столяров
Ещё раз хочу сказать спасибо за опцию "IsRaw" в классе - это тонкий и мощный инструмент,
позволяющий сворачивать огромный объём кода. Но есть один нюанс - она может работать
только в паре с методом экранирования. Т.е. если мы вручную формируем содержание тега:
Код: Выделить всё
gMessage.TagArray = '[{{"value":' & Self.EscapeString('\ЗНАЧЕНИЕ\') & '}]'
Params &= json::CreateObject(gMessage,,'[{{"name":"TagArray","isRaw":true}]')
То обязаны применять для ЗНАЧЕНИЙ тегов экранирование:
Код: Выделить всё
Class.EscapeString Procedure(String sValue) !, String
Code
If Not Self.jTag &= Null then Self.jTag.Delete().
Self.jTag &= json::CreateString(sValue)
Return Self.jTag.ToString()
Я бы предложил рассмотреть варианты - но проблема в том, что их нет. Цугцванг-с !