Страница 26 из 30

libcurl for Clarion

Добавлено: 23 Март 2021, 15:00
RaFaeL
FromJSON работает элементарно. Вам надо создать группу из трех полей: status (long), messages (string,DIM(10)), resp (string, DIM(сколько у вас возвращается я не знаю)). Дальше FromJSON(текст, группа), собственно вроде всё. Какие-то настройки при декодировании не обязательны. Но я с массивами стараюсь не работать, в основном через очереди, но там надо в 2 прохода

libcurl for Clarion

Добавлено: 23 Март 2021, 15:19
Alex
Спасибо за советы. Пробую .
P.S. resp (string, DIM(XX))
XX априори конечно неизвестен
После FromJSON(текст, группа) в группе поля пусты. хм.
Spoiler
JSONGroup Group,PRE(JGR)
status long
messages string(20),DIM(10)
resp string(100),DIM(10000)
end
.....................
IF LEN(CLIP(JSONstring)) > 0
JSON.FromJSON(LocString, JSONGroup)
END
Странно.
LocString &= NEW(STRING(LEN(CLIP(JSONstring))))
Неужели создается нулевой длины. Да. Нашел ошибку. Теперь в LocString значение JSONString присваивается. Но после вызова JSON.FromJSON(LocString, JSONGroup)
Поля JSONGroup пусты.

libcurl for Clarion

Добавлено: 23 Март 2021, 21:48
Дед Пахом
Пользовался cJSON и jFiles, предпочитаю cJSON.

libcurl for Clarion

Добавлено: 24 Март 2021, 9:17
RaFaeL
Alex писал(а): 23 Март 2021, 15:19 Поля JSONGroup пусты.
Префикс не надо у группы. Либо делайте у полей атрибут NAME

libcurl for Clarion

Добавлено: 24 Март 2021, 13:10
Alex
Префикс у группы убрал. Полям JSONGroup.resp значения не присваиваются.
Spoiler
SendRequest ROUTINE
DATA
curl TCurlHttpClass
res CURLcode
qIndex LONG, AUTO
respBuffer &IDynStr

JSONGroup Group ! описание группы для приема данных из строки JSON
status long
messages string(20),DIM(10)
resp string(100),DIM(10000)
end


JSON JSONDataClass

LocString &STRING
CODE
!==================================
! Операторы CURL для получения строки JSON с массивом данных
!==================================
respBufferLen#= LEN(CLIP(respBuffer.Str()))
!===========================================================
! где respBuffer.Str() - ф-ция Libcurl, возвращает JSON строку с ответом
! Проверено . Строка содержит ответ.
!===========================================================
LocString &= NEW(STRING(respBufferLen#))
! Debug('JSONstring '& JSONstring[1:100])
! Debug('respBufferLen '& respBufferLen#)
LocString =respBuffer.Str()
!===================================================
! Проверено. В LocString присвоена строка
!===================================================
IF LEN(CLIP(LocString)) > 0
JSON.FromJson(LocString, JSONGroup)
END
Как я понимаю , поскольку JSON строка это одномерный массив, то в поле группы
resp string(100),DIM(10000)
эта JSON строка должна разместиться. Где 100- макс.длина элемента JSON массива. Где 10000 - максимальное значение элементов в JSON массиве.
Или я неправильно истолковал идеологию?

libcurl for Clarion

Добавлено: 24 Март 2021, 15:07
RaFaeL
Все верно. Я проверил, все присваивается (правда, кавычки не убирает, хотя вроде должен). Но у меня немного переписанный JSONDataClass, попробуйте

libcurl for Clarion

Добавлено: 24 Март 2021, 17:53
Alex
Для FromJSON в случае массива , в котором значения одного поля- список брэндов структура группы и очереди
Spoiler
Brandsgroup GROUP
Name STRING(100)
END
BrandsQueue Queue(Brandsgroup)
END
Тогда JSON.FromJson(LocString, BrandsQueue) формирует очередь брэндов (без кавычек кстати)
Значения в Esc кодировке остаются как были
"\u042f\u0428\u041a\u0418\u041d\u041e","\u042f\u0428\u0424"
выполнение
LocString = JSON.UnEscapeString(LocString)
не приводит к преобразованию в символы.

libcurl for Clarion

Добавлено: 24 Март 2021, 17:59
RaFaeL
Alex писал(а): 24 Март 2021, 17:53 Значения в Esc кодировке остаются как были
Тут https://forum.clarionlife.net/viewtopic ... 296#p44296 я выкладывал функцию для декодирования. Это уже за рамками преобразования из собственно JSON

libcurl for Clarion

Добавлено: 24 Март 2021, 18:26
Alex
Функция для декодирования - спасибо. (только из нее вызывается strtol()- описана где то видимо.)
Просто увидев внутри класса JSON ф-цию JSON.UnEscapeString, предположил , что она должна декодировать Esc кодировку....

libcurl for Clarion

Добавлено: 25 Март 2021, 0:07
RaFaeL
Alex писал(а): 24 Март 2021, 18:26 только из нее вызывается strtol()- описана где то видимо.

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

    MODULE('WIN API')
     strtol(*cstring,long,long),long,raw,name('_strtol')
    END

libcurl for Clarion

Добавлено: 26 Март 2021, 1:28
Alex
Спасибо. Теперь связка libcurl и JSON работает.

libcurl for Clarion

Добавлено: 16 Апрель 2021, 20:04
SergioRaguzini
Привет Всем!

Поставили мне задачу поключить учетную программу к API сайта заявок, с которого ответы на запросы идут не в XML (что для меня привычно), а в JSON, с обработкой которого я пока не сталкивался, поэтому прошу "не кидать тапками" за, возможно, глупые вопросы:
Изначально я решил реализовать это с помощью утилиты командной строки curl.exe, но прочитав данную тему libcurl for Clarion и тему CJSON, понимаю, что, вероятно, использование инструмента libcurl for Clarion может быть гораздо удобнее, итак

с простой предусмотренной API операцией передать HTTP заголовки и GET-запрос с помощью curl.exe трудностей не возникло:

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

curl.exe -H "Version: 2.0" -H "RequestCode: 884b7fc064a" -H "RequestSign: 2c9f389b07c" -X GET http://somesite.ru/api/orders/ -o ping_Response.txt
ответ перенаправил в ping_Response.txt, но в этом случае содержимое этого ответа минимально и можно обойтись без парсинга JSON
а вот другие операции, уже не такие простые и требуют,например POST-передачи данных ввиде JSON (который пришлось передавать ввиде отдельного файла):

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

curl.exe -H "Version: 2.0" -H "RequestCode: 884b7fc064a" -H "RequestSign: 2c9f389b07c" -X POST -d @quota_send.json http://somesite.ru/api/quota/ -o quota_Response.txt
Ответ на эту операцию уже значителен и без JSON-парсинга не обойтись...

Еще паралельно возникают вопросы при работе с JSON: как быть с кодировкой unicode unescape и как конвертировать при отправке в base64 encode

Я скачал libcurl-master и cJSON-master

- достаточно ли для вышеупомянутых примеров возможностей libcurl-master или же cJSON-master также необходим
- в каких примерах из Examples есть что-то похожее
- чем удобнее разобрать(получить в очередь) ответ в JSON (где глянуть такой пример)

Пока не пойму с чего начать, прошу совета уважаемого CLA-сообщества

Спасибо

libcurl for Clarion

Добавлено: 16 Апрель 2021, 20:50
Alex
Привет. Для парсинга JSON ответа я использовал JSON класс.
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа.
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion. Получение ответа происходит в строку. Без использования файла.

libcurl for Clarion

Добавлено: 16 Апрель 2021, 21:14
Дед Пахом
Посмотрите здесь, очень похожий скрипт для curl и его эквивалент на libcurl.

libcurl for Clarion

Добавлено: 16 Апрель 2021, 21:17
SergioRaguzini
Alex писал(а): 16 Апрель 2021, 20:50 Привет. Для парсинга JSON ответа я использовал JSON класс.
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа.
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion. Получение ответа происходит в строку. Без использования файла.
Дед Пахом писал(а): 16 Апрель 2021, 21:14 Посмотрите здесь, очень похожий скрипт для curl и его эквивалент на libcurl.
СПАСИБО!