大家看過上面三個(gè) json 的例子就發(fā)現(xiàn),都是圍繞 cjson 庫的。原因也比較簡單,就是 cjson 是默認(rèn)綁定到 openresty 上的。所以在 linux 環(huán)境下我們也默認(rèn)的使用了他。在 360 天擎項(xiàng)目中, linux 用戶只是很少量的一部分。大部分用戶更多的是 windows 操作系統(tǒng),但 cjson 目前還沒有 windows 版本。所以對(duì)于 windows 用戶,我們只能選擇 dkjson (編解碼效率沒有 cjson 快,優(yōu)勢是純 lua ,完美跨任何平臺(tái))。
并且我們的代碼肯定不會(huì)因?yàn)?win 、 linux 的并存而寫兩套程序。那么我們就必須要把 json 處理部分封裝一下,隱藏系統(tǒng)差異造成的差異化處理。
local _M = { _VERSION = '1.0' }
-- require("ffi").os 獲取系統(tǒng)類型
local json = require(require("ffi").os == "Windows" and "dkjson" or "cjson")
function _M.json_decode( str )
return json.decode(str)
end
function _M.json_encode( data )
return json.encode(data)
end
return _M
在我們的應(yīng)用中,對(duì)于操作系統(tǒng)版本差異、操作系統(tǒng)位數(shù)差異、同時(shí)支持不通數(shù)據(jù)庫使用等,幾乎都是使用這個(gè)方法完成的,十分值得推薦。
額外說個(gè)點(diǎn), github 上有個(gè)項(xiàng)目 cloudflare/lua-resty-json,從官方資料上介紹 decode 的速度更快,我們也做了小范圍應(yīng)用。所以上面的 decode json 對(duì)象來源,就可以改成這個(gè)庫。世界總是有新鮮玩意,多了解多發(fā)發(fā)現(xiàn),然后再充實(shí)自己吧。