Модуль json
Модуль 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-объект. - Параметры: - возвращает: - оригинальное содержание в формате 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-полям во всех кортежах.
__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 numbers - cfg.encode_number_precision- 14 - Precision of floating point numbers - cfg.encode_load_metatables- true - A flag saying whether the serializer will follow __serialize metatable field - cfg.encode_use_tostring- false (ложь) - A flag saying whether to use - tostring()for unknown types- cfg.encode_invalid_as_nil- false (ложь) - A flag saying whether use NULL for non-recognized types - cfg.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_ratiois 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 numbers - cfg.decode_save_metatables- true - A flag saying whether to set metatables for all arrays and maps - cfg.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> 0
- max(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"}' ...