Json decode c: Parsing JSON using C — Stack Overflow
Содержание
Модуль json | Tarantool
Модуль json
определяет процедуры работы с форматом JSON. Он создан на основе модуля Lua-CJSON от Mark Pulford. Полное руководство по Lua-CJSON включено в официальную документацию.
Ниже приведен перечень всех функций и элементов модуля json
.
Имя | Назначение |
---|---|
json.encode() | Конвертация Lua-объекта в JSON-строку |
json.decode() | Конвертация JSON-строки в Lua-объект |
__serialize parameter | Output structure specification |
json.cfg() | Изменение конфигурации |
json.NULL | Аналог «nil» в языке Lua |
-
json.
encode
(lua-value[, configuration]) Конвертация Lua-объекта в JSON-строку.
Параметры: - lua_value – скалярное значение или значение из Lua-таблицы.
- configuration – see json.cfg
возвращает: оригинальное значение, преобразованное в JSON-строку.
тип возвращаемого значения: строка
Пример:
tarantool> json=require('json') --- ... tarantool> json.encode(123) --- - '123' ... tarantool> json.encode({123}) --- - '[123]' ... tarantool> json.encode({123, 234, 345}) --- - '[123,234,345]' ... tarantool> json.encode({abc = 234, cde = 345}) --- - '{"cde":345,"abc":234}' ... tarantool> json.encode({hello = {'world'}}) --- - '{"hello":["world"]}' ...
-
json.
decode
(string[, configuration]) Конвертация JSON-строки в Lua-объект.
Параметры: - string (
string
) – строка в формате JSON. - configuration – see json.cfg
возвращает: оригинальное содержание в формате Lua-таблицы.
тип возвращаемого значения: таблица
Пример:
tarantool> json = require('json') --- ... tarantool> json.decode('123') --- - 123 ... tarantool> json.decode('[123, "hello"]') --- - [123, 'hello'] ... tarantool> json.decode('{"hello": "world"}').hello --- - world ...
Чтобы увидеть применение
json.decode()
в приложении, см. практическое задание Подсчет суммы по JSON-полям во всех кортежах.- string (
__serialize parameter:
Структуру JSON-вывода можно указать с помощью __serialize
:
- „seq“, „sequence“, „array“ — table encoded as an array
- „map“, „mapping“ — table encoded as a map
- function — the meta-method called to unpack serializable representation
of table, cdata or userdata objects
Serializing „A“ and „B“ with different __serialize
values brings different
results:
tarantool> json.encode(setmetatable({'A', 'B'}, { __serialize="seq"})) --- - '["A","B"]' ... tarantool> json.encode(setmetatable({'A', 'B'}, { __serialize="map"})) --- - '{"1":"A","2":"B"}' ... tarantool> json.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="map"})}) --- - '[{"f2":"B","f1":"A"}]' ... tarantool> json.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="seq"})}) --- - '[[]]' ...
-
json.
cfg
(table) Set values that affect the behavior of json.encode
and json.decode.The values are all either integers or boolean
true
/false
.Характеристика Значение по умолчанию Назначение cfg.encode_max_depth
128 Max recursion depth for encoding cfg.encode_deep_as_nil
false (ложь) A flag saying whether to crop tables
with nesting level deeper than
cfg.
.encode_max_depth
Not-encoded fields are replaced with
one null. If not set, too deep
nesting is considered an error.cfg.encode_invalid_numbers
true A flag saying whether to enable encoding
of NaN and Inf numberscfg.encode_number_precision
14 Precision of floating point numbers cfg.encode_load_metatables
true A flag saying whether the serializer will
follow __serialize
metatable fieldcfg.encode_use_tostring
false (ложь) A flag saying whether to use
tostring()
for unknown typescfg.encode_invalid_as_nil
false (ложь) A flag saying whether use NULL for
non-recognized typescfg.encode_sparse_convert
true A flag saying whether to handle
excessively sparse arrays as maps.
See detailed description
below.cfg.encode_sparse_ratio
2 1/ encode_sparse_ratio
is the
permissible percentage of missing values
in a sparse array.cfg.encode_sparse_safe
10 A limit ensuring that small Lua arrays
are always encoded as sparse arrays
(instead of generating an error or
encoding as a map)cfg.decode_invalid_numbers
true A flag saying whether to enable decoding
of NaN and Inf numberscfg.decode_save_metatables
true A flag saying whether to set metatables
for all arrays and mapscfg.decode_max_depth
128 Max recursion depth for decoding
Sparse arrays features:
During encoding, the JSON encoder tries to classify a table into one of four kinds:
- map — at least one table index is not unsigned integer
- regular array — all array indexes are available
- sparse array — at least one array index is missing
- excessively sparse array — the number of values missing exceeds the configured ratio
An array is excessively sparse when all the following conditions are met:
encode_sparse_ratio
> 0max(table)
>encode_sparse_safe
max(table)
>count(table)
*encode_sparse_ratio
The JSON encoder will never consider an array to be excessively sparse
when encode_sparse_ratio = 0
. The
encode_sparse_safe
limit ensures
that small Lua arrays are always encoded as sparse arrays.
By default, attempting to encode an excessively sparse array will
generate an error. If encode_sparse_convert
is set to true
,
excessively sparse arrays will be handled as maps.
json.cfg() example 1:
The following code will encode 0/0 as NaN («not a number»)
and 1/0 as Inf («infinity»), rather than returning nil or an error message:
json = require('json') json.cfg{encode_invalid_numbers = true} x = 0/0 y = 1/0 json.encode({1, x, y, 2})
Результат запроса json.encode()
будет следующим:
tarantool> json.encode({1, x, y, 2}) --- - '[1,nan,inf,2] ...
json.cfg example 2:
To avoid generating errors on attempts to encode unknown data types as
userdata/cdata, you can use this code:
tarantool> httpc = require('http.client').new() --- ... tarantool> json.encode(httpc.curl) --- - error: unsupported Lua type 'userdata' ... tarantool> json.encode(httpc.curl, {encode_use_tostring=true}) --- - '"userdata: 0x010a4ef2a0"' ...
Примечание
To achieve the same effect for only one call to json.encode()
(i.e.
without changing the configuration permanently), you can use
json.encode({1, x, y, 2}, {encode_invalid_numbers = true})
.
Similar configuration settings exist for MsgPack
and YAML.
-
json.
NULL
Значение, сопоставимое с нулевым значением «nil» в языке Lua, которое можно использовать в качестве объекта-заполнителя в кортеже.
Пример:
-- Когда полю Lua-таблицы присваивается nil, это поле -- null tarantool> {nil, 'a', 'b'} --- - - null - a - b ... -- Когда полю Lua-таблицы присваивается json.NULL, это поле -- json.NULL tarantool> {json.NULL, 'a', 'b'} --- - - null - a - b ... -- Когда JSON-полю присваивается json.
NULL, это поле -- null tarantool> json.encode({field2 = json.NULL, field1 = 'a', field3 = 'c'}) --- - '{"field2":null,"field1":"a","field3":"c"}' ...
Нашли ответ на свой вопрос?
Обратная связь
Библиотека исходного кода JSON C для связи IoT
Кодировщик/декодер JSON (библиотека C) доступен на GitHub. На этой странице представлена информация о том, как использовать библиотеку C и как использовать JSON для связи IoT в реальном времени.
Узнайте, как использовать JSON для общения в реальном времени и как использовать нашу бесплатную библиотеку JSON C.
JSON стал популярным форматом обмена данными межпроцессного взаимодействия (IPC) для различных компьютерных языков. Важно понимать, что JSON — это не протокол, а формат кодирования. JSON позволяет сериализовать структурированные данные в текстовый формат, который затем отправляется по сети на принимающую сторону.
Протоколы JSON и IoT
JSON обычно используется вместе с протоколами IoT, которые не обеспечивают встроенной поддержки сериализации структуры данных, такими как HTTP/Rest, WebSockets, MQTT и протокол SMQ IoT.
Большинство протоколов Интернета вещей используют TCP/IP в качестве транспортного механизма. TCP/IP — это протокол на основе потока, который не включает никакой информации о кадрах при использовании для отправки сообщений по сети. Протоколы IoT добавляют информацию о кадрировании поверх TCP/IP при передаче данных, что упрощает отправку пакетов по сети. Например, протокол WebSocket добавляет заголовок размера к данным, а стек WebSocket предоставляет API на основе пакетов для разработчиков приложений, использующих стек. Протоколы Pub/Sub, такие как MQTT и SMQ, также предоставляют API на основе пакетов.
Поскольку протоколы IoT предоставляют API на основе пакетов, любой кодировщик/декодер JSON можно использовать для сериализации и десериализации структурированных данных, отправляемых по сети. Однако в некоторых случаях протокол IoT является излишним и может добавить ненужную память и накладные расходы на обработку. Разработчик продукта IoT может напрямую использовать TCP/IP в качестве транспортного уровня для отправки структурированных данных по сети. Стандартный кодировщик/декодер JSON нельзя использовать при использовании транспортного уровня без кадров.
Потоковый разбор JSON
Наша библиотека C JSON с открытым исходным кодом упрощает преобразование C в JSON и JSON в C. Библиотека JSON включает простые в использовании API для сериализации структур C и для десериализации структур C. Данные JSON можно отправлять непосредственно в потоке данных без кадров, таком как TCP/IP. За счет устранения протокола IoT и прямого использования TCP/IP размер кода может составлять всего 1 КБ ПЗУ.
Наш синтаксический анализатор C JSON предназначен для анализа данных в потоке без кадров и может правильно анализировать пакеты JSON по мере их поступления в поток необработанных данных.
Асинхронная связь в реальном времени
В отличие от протоколов, основанных на удаленных вызовах процедур (RPC), таких как HTTP и CoAP, структурированные данные могут отправляться асинхронно в обоих направлениях в любое время. Это резко контрастирует с приложениями на основе HTTP/REST, которые требуют опроса для получения обновлений. Опрос обновлений особенно неэффективен, когда требуются безопасность и шифрование. Чтобы понять, почему это такая плохая идея, прочтите руководство Проблема масштабируемости при использовании HTTPS/REST для IoT.
Безопасность
Безопасность можно легко добавить с помощью стека протоколов TLS (SSL). Уровень TLS добавляется между кодировщиком/декодером JSON и стеком TCP/IP. Добавление безопасности увеличивает размер кода, а добавляемый размер зависит от используемого стека TLS. С SharkSSL можно ограничить размер этого кода чуть менее 20 КБ.
Details
Если вы заинтересованы в создании сетевых программ на C/C++, которые отправляют структурированные данные через необработанное соединение TCP/IP, прочтите подробное объяснение того, как использовать наш кодировщик/декодер JSON. Дополнительные сведения см. в документации по кодировщику/декодеру JSON.
TCP-JSON против HTTP/AJAX/REST TL;DR Диаграмма
Для быстрого визуального сравнения двух вариантов посмотрите нашу диаграмму «слишком долго; не читал»:
JSON с AJAX через сокет ( TCP/IP) соединение
У вас может быть приложение, в котором AJAX является предпочтительной моделью связи. TCP/IP позволяет нам мультиплексировать данные в одном и том же соединении, поэтому мы можем легко реализовать библиотеку AJAX поверх TCP/IP и по-прежнему использовать одно и то же соединение TCP для двунаправленной передачи данных в реальном времени. См. наше руководство по AJAX через WebSockets, если вы хотите узнать больше о том, как использовать эту библиотеку JSON C для связи AJAX.
Загрузить исходный код с GitHub
- Загрузить исходный код библиотеки JSON C/C++ с GitHub
Загрузка GitHub включает несколько примеров для Windows и Linux. Протестируйте синтаксический анализатор JSON с непрерывным синтаксическим анализом, используя готовый к использованию пример IoT с использованием Linux следующим образом:
git clone https://github. com/RealTimeLogic/JSON
компакт-диск JSON
делать
./m2mled
Когда запустится пример m2m, перейдите по адресу: realtimelogic.info/IoT/led/json/ и щелкните ссылку на подключенное устройство.
Ознакомьтесь с бесплатной встроенной IDE для новичков, если вам интересно узнать, как использовать эту библиотеку JSON для кодирования и декодирования сообщений IoT.
Библиотека JSON также используется в справочном примере Minnow Server, в котором для связи используется библиотека Embedded WebSocket Server и JSON. Пример Minnow Server показывает, как использовать синтаксический анализатор JSON в потоковом режиме, когда данные WebSocket поступают на устройство. В примере также показано, как использовать статический (не динамический) распределитель с анализатором и кодировщиком JSON. Справочный пример Minnow Server доступен на GitHub. В следующем видео показано, как работает эталонный пример Minnow Server и как JSON используется для обмена сообщениями:
youtube.com/embed/mAY2CpjYRLU» frameborder=»0″ allow=»autoplay; encrypted-media» allowfullscreen=»»>
Пример C++
Пример публикации и подписки SMQ C++ показывает, как использовать библиотеку JSON для связи в реальном времени. В следующем видео показано, как запустить пример пакета с использованием трех терминалов в Linux. Вы бы использовали ту же последовательность запуска в Windows, используя три окна консоли.
ДОПОЛНИТЕЛЬНОЕ СОДЕРЖИМОЕ
- Руководства по встроенному веб-серверу
- AJAX через WebSockets (с использованием JSON)
Анализ JSON в C++ с помощью RapidJSON | Энтони Мораст
Photo by Ferenc Almasi on Unsplash
Ранее в этом году, выполняя консультационную работу, мне потребовалось проанализировать файлы JSON, загруженные с URL-адреса на C++. Эту задачу легко выполнить на большинстве языков, многие из которых имеют встроенные библиотеки для чтения и записи файлов JSON (например, пакет json в Python). Однако в случае с C++, как и в большинстве случаев в C++, нет встроенных функций для работы с файлами JSON или строками в формате JSON. Есть одна популярная библиотека, которую используют многие люди, но я обнаружил, что она довольно медленная по сравнению с другой библиотекой, RapidJSON , при работе с большими файлами JSON (например, чтение данных тикера OHLC за ~9 лет в JsonCpp заняло ~20 минут и всего несколько секунд с RapidJSON).
Хотя документация для RapidJSON очень хороша, я подумал, что было бы полезно увидеть пример программирования для обработки файла JSON на C++. В этом посте я представлю общий способ чтения файла JSON (или строки) в объект документа RapidJSON, а также приведу пример этого из проекта, над которым я сейчас работаю.
RapidJSON — это библиотека, предназначенная для обеспечения быстрого анализа и создания файлов JSON на C++. Библиотека может быть включена в проект C++ одним из двух способов: реализация только заголовка может быть скопирована в исходный каталог вашего проекта, или можно использовать CMAKE для установки проекта, который затем можно связать с g++ через -lrapidjson. Любой метод приводит к одинаковому использованию, меняется только сборка проекта и включение библиотеки. Дополнительную информацию можно найти на GitHub проекта.
Класс Document в RapidJSON содержит содержимое файла JSON в надлежащей структуре, что позволяет анализировать данные JSON. Класс включается следующим образом:
Отсюда очень просто прочитать содержимое файла JSON. Приведенный ниже класс JsonParser можно использовать для анализа файла JSON с помощью функции getJsonDocument(…) , которая возвращает объект rapidjson::Document.
В качестве примера я буду использовать файл JSON из проекта, над которым сейчас работаю. Это очень простой файл JSON без массивов, но он представляет собой базовый пример использования.
Приведенный выше JSON представляет собой некоторые параметры решателя Lattice Boltzmann для гидродинамики. Это можно проанализировать, расширив класс JsonParser выше.
Поскольку большинство файлов JSON имеют вложенные структуры массивов, еще одной важной операцией с файлами JSON является повторение массивов JSON. Хотя в настоящее время я не делаю этого в проекте, о котором упоминал выше (скоро буду), я сделал это в консалтинговом проекте, упомянутом ранее в посте. Ниже приведен фрагмент из этой кодовой базы, демонстрирующий итерацию массива JSON в RapidJSON.
Как видно из приведенного выше фрагмента кода, объект документа RapidJSON имеет метод GetArray() , который возвращает объект RapidJSON Value, содержащий данные JSON. Для пояснения: весь проанализированный JSON в RapidJSON хранится в объекте Value. Объект Document — это объект, который представляет DOM и содержит корневое значение дерева DOM.
В этом посте был представлен API для синтаксического анализа JSON RapidJSON. Были показаны и объяснены некоторые примеры использования, представленные в виде фрагментов кода из двух разных проектов, над которыми я работал. Для тех, кому нужна более подробная информация о RapidJSON, у проекта есть очень информативный репозиторий GitHub и еще более информативная документация. Цель этого поста состояла в том, чтобы познакомить с этим проектом тех, кто не знает о его существовании (поскольку я думаю, что большинство людей придерживаются JsonCpp), и предоставить очень примитивное использование, чтобы вы могли начать использовать проект.