開源庫 lua-cjson 安裝及使用
開源庫 lua-cjson 是一個簡
a-cjson API 調用完成 Lua 值與 Json 值的相互轉換(編碼及解碼)。
註:lua-cjson 要求編碼格式為UTF8。lua-cjson 不支持 UTF-16 and UTF-32。
Step 1:安裝 Lua 環境:
上傳 Lua 源碼 lua-5.3.5.tar.gz 到用戶主目錄($HOME)下,解壓縮,獲得 lua-5.3.5 目錄。
修改 $HOME/lua-5.3.5/Makefile 文件:
編譯 && 安裝:
安裝完畢:
Step 2:安裝 lua-cjson 庫:
上傳 lua-cjson 源碼 lua-cjson-2.1.0.tar.gz 到用戶主目錄($HOME)下,解壓縮,獲得 lua-cjson-2.1.0 目錄。
修改 $HOME/lua-cjson-2.1.0/Makefile 文件:
編譯 && 安裝:
安裝完畢:
執行 lua 腳本:
執行 lua 腳本:
註:
1)LUA_CPATH=$HOME/lua/lib/lua/5.1/?.so lua
將 LUA_CPATH 作為環境變數傳入 lua 進程環境表,以便 lua 在執行 require 函數時可以知道從哪裡 dlopen 這個動態庫。
當然,沒必要一定寫到命令行中,完全可以寫到 $HOME/.bash_profile 中,export LUA_CPATH。
上面的示例代碼中使用了兩個 API:cjson.encode and cjson.decode。
cjson.encode 是用於編碼,將 lua 值轉換為 json 字元串; cjson.decode 是用於解碼,將 json 字元串轉換為 lua 值;
除了這兩個 API,還有以下 API 可以使用:
上面的示例中也有使用到 new 介面:
可以通過 new 介面創建一個 cjson 實例對象,此對象含有獨立的編解碼緩衝區以及獨立的配置參數表。
如果多個線程同時對同一個 cjson 實例對象調用編解碼操作,結果是不可預估的。
因為多個線程本質上對同時對同一編解碼緩衝區進行了讀寫操作。
所以,不同線程應當串列操作同一個 cjson 實例對象 或 並行操作互不相同的 cjson 實例對象(不同的編解碼緩衝區)。
Lua CJSON can support Lua implementations using multiple preemptive threads within a single Lua state provided the persistent encoding buffer is not shared.
This can be achieved by one of the following methods:
Disabling the persistent encoding buffer with cjson.encode_keep_buffer
Ensuring each thread calls cjson.encode separately (ie, treat cjson.encode as non-reentrant).
Using a separate cjson module table per preemptive thread (cjson.new)
lua-cjson 提供一些 API 以修改 cjson 實例對象的參數表默認配置,來影響 cjson 實例對象在編碼解碼時的行為過程。
例如,可以通過 encode_max_depth 和 decode_max_depth 來更改編解碼時的最大嵌套深度,等等。
關於 lua-cjson cjson.encode 序列化 Lua 值的一點問題
執行結果為:
當存在某 key-value 對且 key 類型不是 number 類型:
執行結果為:
原因在於:
Lua CJSON uses a heuristic to determine whether to encode a Lua table as a JSON array or an object.
A Lua table with only positive integer keys of type number will be encoded as a JSON array.
All other tables will be encoded as a JSON object.
另外,cjson.encode 不會觸發元方法:
Lua CJSON does not use metamethods when serialising tables.
rawget is used to iterate over Lua arrays
next is used to iterate over Lua objects
以及,若待轉換的 Lua table 中的 key 有非 number 且非 string 類型值,則轉換時報錯:
JSON object keys are always strings.
Hence cjson.encode only supports table keys which are type number or string.
All other types will generate an error.
在 cjson.encode 時,由於待轉換 Lua table 不符合轉換要求可能引發一些錯誤:
By default, encoding the following Lua values will generate errors:
Numbers incompatible with the JSON specification (infinity, NaN)
Tables nested more than 1000 levels deep
Excessively sparse Lua arrays
我們可以通過一些 lua-cjson 提供的 API,修改 cjson 實例對象默認參數值,使得在 encode 時行為改變:
cjson.encode_invalid_numbers
cjson.encode_max_depth
cjson.encode_sparse_array
1.https://www.kyne.com.au/~mark/software/lua-cjson-manual.html#encode_max_depth
1.https://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
2.https://www.kyne.com.au/~mark/software/lua-cjson.php
3.https://github.com/mpx/lua-cjson/
※夏季適合IT程序員的養生小妙招
※安卓okhttp3與伺服器通過json數據交互解析與上傳
TAG:程序員小新人學習 |