Страница 1 из 3

cJSON

Добавлено: 21 Сентябрь 2018, 20:27
Дед Пахом
Перегнал cJSON (парсер json, написанный на ANSI C) на Clarion. Скачать можно здесь, есть примеры использования. Предложения и замечания приветствуются.

cJSON

Добавлено: 23 Сентябрь 2018, 0:54
Дед Пахом
Обновил до gold-версии v1.00. Работает отлично.

cJSON

Добавлено: 26 Сентябрь 2018, 21:14
Дед Пахом
Обновил до v1.02, теперь можно управлять отдельными полями при чтении/записи групп/очередей/файлов:
- '{{"name":"LastVisitDate", "format":"@d10-"}' - поле даты LastVisitDate будет записано в json в формате @d10-
- '{{"name":"Password", "ignore":true}' - поле Password в json записано не будет.

cJSON

Добавлено: 27 Сентябрь 2018, 23:37
Дед Пахом
v1.03:
  • добавил опцию "jsonname" (замена имени поля группы на другое имя в json)
  • исправил ошибку в функции parse_number
  • тест на скорость разборки большого json файла

cJSON

Добавлено: 26 Октябрь 2018, 18:57
gopstop2007
продолжая тему viewtopic.php?p=35332#p35332
получилось перекодировать результат с сервера в два шага из json строки:
1. jsonFactory.Parseс unicode в utf-8 (cJSON)
2. из utf8 в ascii с помощью Cstr
не нашел, как сделать за один шаг?
есть ли возможность перекодировать из ascii -> unicode для JSON строки?

cJSON

Добавлено: 26 Октябрь 2018, 19:15
Дед Пахом
Пока ни того, ни другого нет, может сделаю.

cJSON

Добавлено: 29 Октябрь 2018, 17:49
Дед Пахом
v1.09 на GitHub, новый пример novapochta для демонстрации смены кодировки.
Вкратце:
- если json содержит символы в utf-8 или последовательности вида \uXXXX, то:

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

parser                          cJSONFactory
    parser.codePage = CP_ACP    !- convert utf8 to ascii (active code page)
    jRoot &= parser.Parse(jsonString)
- если, наоборот, надо сохранить в json строки в utf-8, то:

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

curl.SendRequest(url, jParams.ToUtf8(FALSE, CP_ACP))

cJSON

Добавлено: 29 Октябрь 2018, 18:33
gopstop2007
Дед Пахом писал(а): 29 Октябрь 2018, 17:49 v1.09 на GitHub, новый пример novapochta для демонстрации смены кодировки.
Супер, проверил, работает. Спасибо огромное. :)

cJSON

Добавлено: 29 Октябрь 2018, 21:24
Дед Пахом
Если неохота возиться с json-объектами, можно сформировать строку напрямую, а в unicode перекодировать с помощью json::StringToULiterals:

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

postparams.Cat('{{"apiKey": "","modelName": "Address","calledMethod": "searchSettlements","methodProperties": {{"CityName": "'& json::StringToULiterals('київ') &'","Limit": 5}}')

libcurl for Clarion

Добавлено: 13 Май 2019, 8:11
Admin

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

Parameters  GROUP
companies     STRING(20),DIM(50),NAME('companies')
sapCodes      STRING(20),DIM(50),NAME('sapCodes')
startDate     STRING(20),NAME('startDate')
endDate       STRING(20),NAME('endDate')
            END
params &= json::CreateObject(Parameters, FALSE)
Получаю пустые поля для незаполненных элементов companies и sapCodes.

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

{"companies":["1", "2", "3", "39", "40", "", "", "", "", ...],"sapCodes":["100345", "100413", "", "", ...],"startDate":"2019-05-13","endDate":"2019-05-13"}
Как от этого избавиться?

libcurl for Clarion

Добавлено: 13 Май 2019, 12:54
Дед Пахом
Admin писал(а): 13 Май 2019, 8:11Как от этого избавиться?
вижу 3 варианта:
1. удалить лишние элементы (DeleteItemFromArray)
2. передать в json::CreateObject третий параметр 'options', в котором указать реальные размеры массивов. Правда, такой опции ещё нет.
3. отказаться от json::CreateObject(group), а формировать json по частям.

libcurl for Clarion

Добавлено: 13 Май 2019, 15:03
Admin
Дед Пахом писал(а): 13 Май 2019, 12:54формировать json по частям
Где то есть пример?

libcurl for Clarion

Добавлено: 13 Май 2019, 15:24
Дед Пахом
Admin писал(а): 13 Май 2019, 15:03Где то есть пример?
CreateJSON.clw например.
А libcurl тут причём, кстати? Может, перенести в ветку cjson?

cJSON

Добавлено: 13 Май 2019, 16:08
Admin
Дед Пахом писал(а): 13 Май 2019, 15:24CreateJSON.clw например.
Забыл что это отдельный продукт. Попробую. Спасибо.

cJSON

Добавлено: 14 Май 2019, 2:19
Admin
По итогу сделал себе такую процедуру.
Из первого поля переданной очереди создает массив.
В зависимости от типа поля Numeric или String

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

json::CreateQueueArray          PROCEDURE(*QUEUE Q)!, *cJSON
i                               LONG, AUTO
n                               &cJSON
p                               &cJSON
a                               &cJSON
  CODE
  a &= json::CreateArray()
  
  LOOP i = 1 TO RECORDS(Q)
    IF NOT a &= NULL
      GET(Q, i)
      IF NOT ERRORCODE() 
        IF ISSTRING(WHAT(Q,1))
          n &= json::CreateString(WHAT(Q,1))
        ELSE
          n &= json::CreateNumber(WHAT(Q,1))
        END
        IF n &= NULL
          a.Delete()
          RETURN NULL
        END
        
        IF i = 1
          a.child &= n
        ELSE
          suffix_object(p, n)
        END
        
        p &= n
      END
    END
  END

  RETURN a