高同時Nginx+Lua OpenRestyシリーズ(7)——Lua開発ライブラリjson
3698 ワード
JSONライブラリ
データ転送時のJSON形式は現在広く応用されているため、LuaオブジェクトとJSON文字列間の相互変換は非常に一般的な機能である.現在LuaにもいくつかのJSONライブラリがあります.例えば、cjson、dkjsonです.ここでcjsonの文法は厳格で(例えばunicode<20>u 7 eaf)、要求が規範に合致しないと解析に失敗し(例えば<2)、dkjsonは比較的緩やかで、もちろんcjsonのソースコードを修正することによっていくつかの特殊な要求を完成することができます.dkjsonを使用しても性能の問題はなく、現在はdkjsonを使用しています.使用時に特に注意しなければならないのは、ほとんどのJSONライブラリがUTF-8符号化のみをサポートしていることです.したがって、文字コードがGBKのような場合は、まずUTF-8に変換して処理する必要があります.
1.1 test_cjson.lua
nullはcjsonに変換されます.null;循環参照は異常Cannot serialise,excessive nestingを放出し、デフォルトの解析ネスト深さは1000であり、cjsonを通過することができる.encode_max_depth()深さを設定して性能を向上させる;cjsonを使用します.safeは異常を投げ出すのではなくnilに戻る.
1.2 openResty.confプロファイル
1.3結果の表示
lua-cjsonドキュメントhttp://www.kyne.com.au/~mark/software/lua-cjson-manual.html. 次にdkjsonを勉強します.
2.1 dkjsonライブラリのダウンロード
2.2 test_dkjson.lua
デフォルトで解析されたjsonの文字には縮退と改行があり、{indent=true}構成を使用してすべての内容を1行に配置します.cjsonとは異なり、json文字列のnullを解析するとnilが得られます.
2.3 openResty.confプロファイル
2.4結果の表示
dkjsonドキュメントhttp://dkolf.de/src/dkjson-lua.fsl/homeおよびhttp://dkolf.de/src/dkjson-lua.fsl/wiki?name=Documentation.
データ転送時のJSON形式は現在広く応用されているため、LuaオブジェクトとJSON文字列間の相互変換は非常に一般的な機能である.現在LuaにもいくつかのJSONライブラリがあります.例えば、cjson、dkjsonです.ここでcjsonの文法は厳格で(例えばunicode<20>u 7 eaf)、要求が規範に合致しないと解析に失敗し(例えば<2)、dkjsonは比較的緩やかで、もちろんcjsonのソースコードを修正することによっていくつかの特殊な要求を完成することができます.dkjsonを使用しても性能の問題はなく、現在はdkjsonを使用しています.使用時に特に注意しなければならないのは、ほとんどのJSONライブラリがUTF-8符号化のみをサポートしていることです.したがって、文字コードがGBKのような場合は、まずUTF-8に変換して処理する必要があります.
1.1 test_cjson.lua
local cjson = require("cjson")
--lua
local obj = {
id = 1,
name = "zhangsan",
age = nil,
is_male = false,
hobby = {"film", "music", "read"}
}
local str = cjson.encode(obj)
ngx.say(str, "
")
-- lua
str = '{"hobby":["film","music","read"],"is_male":false,"name":"zhangsan","id":1,"age":null}'
local obj = cjson.decode(str)
ngx.say(obj.age, "
")
ngx.say(obj.age == nil, "
")
ngx.say(obj.age == cjson.null, "
")
ngx.say(obj.hobby[1], "
")
--
obj = {
id = 1
}
obj.obj = obj
-- Cannot serialise, excessive nesting
--ngx.say(cjson.encode(obj), "
")
local cjson_safe = require("cjson.safe")
--nil
ngx.say(cjson_safe.encode(obj), "
")
nullはcjsonに変換されます.null;循環参照は異常Cannot serialise,excessive nestingを放出し、デフォルトの解析ネスト深さは1000であり、cjsonを通過することができる.encode_max_depth()深さを設定して性能を向上させる;cjsonを使用します.safeは異常を投げ出すのではなくnilに戻る.
1.2 openResty.confプロファイル
location ~ /lua_cjson {
default_type 'text/html';
lua_code_cache on;
content_by_lua_file /usr/openResty/json/lua/test_cjson.lua;
}
1.3結果の表示
{"is_male":false,"name":"zhangsan","hobby":["film","music","read"],"id":1}
null
false
true
film
nil
lua-cjsonドキュメントhttp://www.kyne.com.au/~mark/software/lua-cjson-manual.html. 次にdkjsonを勉強します.
2.1 dkjsonライブラリのダウンロード
cd /usr/openResty/lualib
wget http://dkolf.de/src/dkjson-lua.fsl/raw/dkjson.lua?name=16cbc26080996d9da827df42cb0844a25518eeb3 -O dkjson.lua
2.2 test_dkjson.lua
local dkjson = require("dkjson")
--lua
local obj = {
id = 1,
name = "zhangsan",
age = nil,
is_male = false,
hobby = {"film", "music", "read"}
}
local str = dkjson.encode(obj, {indent = true})
ngx.say(str, "
")
-- lua
str = '{"hobby":["film","music","read"],"is_male":false,"name":"zhangsan","id":1,"age":null}'
local obj, pos, err = dkjson.decode(str, 1, nil)
ngx.say(obj.age, "
")
ngx.say(obj.age == nil, "
")
ngx.say(obj.hobby[1], "
")
--
obj = {
id = 1
}
obj.obj = obj
--reference cycle
--ngx.say(dkjson.encode(obj), "
")
デフォルトで解析されたjsonの文字には縮退と改行があり、{indent=true}構成を使用してすべての内容を1行に配置します.cjsonとは異なり、json文字列のnullを解析するとnilが得られます.
2.3 openResty.confプロファイル
location ~ /lua_dkjson {
default_type 'text/html';
lua_code_cache on;
content_by_lua_file /usr/openResty/lua/json/test_dkjson.lua;
}
2.4結果の表示
{ "is_male":false, "name":"zhangsan", "hobby":["film","music","read"], "id":1 }
nil
true
film
dkjsonドキュメントhttp://dkolf.de/src/dkjson-lua.fsl/homeおよびhttp://dkolf.de/src/dkjson-lua.fsl/wiki?name=Documentation.