請看示例代碼(注意 data 的數(shù)組下標(biāo)):
-- http://www.kyne.com.au/~mark/software/lua-cjson.php
-- version: 2.1 devel
local json = require("cjson")
local data = {1, 2}
data[1000] = 99
-- ... do the other things
ngx.say(json.encode(data))
運(yùn)行日志報錯結(jié)果:
2015/06/27 00:23:13 [error] 2714#0: *40 lua entry thread aborted: runtime error: ...ork/git/github.com/lua-resty-memcached-server/t/test.lua:13: Cannot serialise table: excessively sparse array
stack traceback:
coroutine 0:
[C]: in function 'encode'
...ork/git/github.com/lua-resty-memcached-server/t/test.lua:13: in function <...ork/git/github.com/lua-resty-memcached-server/t/test.lua:1>, client: 127.0.0.1, server: localhost, request: "GET /test HTTP/1.1", host: "127.0.0.1:8001"
如果把 data 的數(shù)組下標(biāo)修改成 5 ,那么這個 json.encode 就會是成功的。 結(jié)果是:[1, 2,null, null, 99]
為什么下標(biāo)是 1000 就失敗呢?實際上這么做是 cjson 想保護(hù)你的內(nèi)存資源。她擔(dān)心這個下標(biāo)過大直接撐爆內(nèi)存(貼心小棉襖?。?。如果我們一定要讓這種情況下可以 encode,就要嘗試 encode_sparse_array API 了。有興趣的同學(xué)可以自己試一試。我相信你看過有關(guān) cjson 的代碼后,就知道 cjson 的一個簡單危險防范應(yīng)該是怎樣完成的。