cJSON: Формат полей для вложенных структур

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

Не такая уж эта комбинация и многоходовая.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Можно сказать и так. С точки зрения программиста С, список списков указателей - вообще обычное дело. :)
Код работает - здесь скорей вопрос сворачивания повторяющихся рутинных операций с указателями в метода класса.
Ну и сама операция перадачи файла через тег - вполне востребована. Это не только документы, но картинки, сертификаты и т.д.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Что бы не плодить темы в форуме - можно я здесь спрошу ?

Нужно передать в теге русский текст в UTF8.

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

Tag = json::ToUtf8('Русский текст')
Если это обычная строка, то метод json::CreateObject() штатно сам выполнит экранирование.
Но если {"Name":"Tag","IsRaw":True} - то я должен экранировать содержание тега после кодирования в UTF8 самостоятельно ?
А как (метод) ? Заранее спасибо - сам не нашёл ... :shock:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

json::ToUtf8() должна помочь.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Дед Пахом писал(а): 24 Ноябрь 2022, 15:46 json::ToUtf8() должна помочь.
Не пугайте меня пожалуйста ! ToUTF8() - это обычная конвертация ANSI -> UTF8. :shock:

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

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": "{\" ! <-- Это ошибка - нужно применять экранирование к содержанию тега
}
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

Не знаю зачем, но (если я понял задачу) как-то так:

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

jTag &= json::CreateString('...')  !- или другой какой json::Create
grp.tag = jTag.ToString()
jTag.Delete()
Params &= json::CreateObject(grp,,'[{{"name":"tag","isRaw":true}]')
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Спасибо. Это просто нужно знать и уметь работать с &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": "{\\"
}
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Я честно пытаюсь думать. Но можно крайний раз спросить ? ;)
А как в этом варианте выгрузить массив (строка без кавычек) - ради этого ведь и делался "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}]')
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

Ну барин... тут без CreateObject+AddStringToObject вряд ли обойтись. Я так понимаю, Вы весь json пихаете в строку, а затем IsRaw и вуаля.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Дед Пахом писал(а): 24 Ноябрь 2022, 20:18 CreateObject+AddStringToObject вряд ли обойтись
Не. Это ручное формирование JSON и прямой путь в дурку. Бум думать дальше, выход есть всегда ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Игорь сделал выгрузку массива в строке !

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

  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 должен существовать.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Сделал метод для загрузки в тег файла, как доступная мне альтернатива опции "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" ?
Спасибо ! :)
Последний раз редактировалось Игорь Столяров 25 Ноябрь 2022, 12:02, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Дед Пахом »

Пока не забыл: как писал Диего Б., IDynStr надо очищать перед DisposeDynStr:

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

xBuffer.Kill()
DisposeDynStr(xBuffer)
Как их оттуда получить ? В поле с "IsStringRef" ?
Как-то так:

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

jFileContents &= jRoot.FindObjectItem('file1')
refFileContent &= jFileContents.GetStringRef()
SaveFile('file1.txt', FromBase64(refFileContent))
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Дед Пахом писал(а): 25 Ноябрь 2022, 11:07 IDynStr надо очищать перед DisposeDynSt
Век живи - век учись ... Спасибо, теперь всегда буду очищать. :)
С загрузкой файла из тега тоже всё понятно ... :ty:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

Сообщение Игорь Столяров »

Ещё раз хочу сказать спасибо за опцию "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()
Я бы предложил рассмотреть варианты - но проблема в том, что их нет. Цугцванг-с ! ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Закрыто