前面的文章记录了lua的编译和使用,这里再整理一下,侧重说明下lua json库的编译及使用,文章最后再谈下cjson使用中有可能遇到的excessively sparse array 问题及解决方法。
# wget http://www.lua.org/ftp/lua-5.3.2.tar.gz # tar -zxf lua-5.3.2.tar.gz # cd lua-5.3.2 # make linux # make install
# wget http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz # tar -zxf lua-cjson-2.1.0.tar.gz # cd lua-cjson-2.1.0 # make all
# cp cjson.so /usr/local/lib/lua/5.3 # chmod 755 /usr/local/lib/lua/5.3/cjson.so
# /usr/local/bin/lua Lua 5.3.2 Copyright (C) 1994-2015 Lua.org, PUC-Rio > cjson = require "cjson" > json = cjson.new() > json_text = '{ "foo": "bar" }' > value = json.decode(json_text) > for k,v in pairs(value) do print("json", k, v) end json foo bar > list = { foo = "bar" } > return json.encode(list) {"foo":"bar"}
> json.encode({[11]=1}) stdin:1: Cannot serialise table: excessively sparse array stack traceback: [C]: in field 'encode' stdin:1: in main chunk [C]: in ?如果所有的key都是数字,cjson会使用类似数组的形式来记录数据,记为 sparse array,这种形式的好处是减少key占用的字符串大小 。但是,当最大的key大于10,并且超过了元素个数的2倍时,就会报这个错误。
> json.encode({[10]=1}) [null,null,null,null,null,null,null,null,null,1]
# /usr/local/bin/lua > cjson = require "cjson" > json = cjson.new() > json.encode_sparse_array(true,1) true 1 10 > json.encode({[11]=1}) {"11":1} > json.encode({[2]=1}) {"2":1} > json.encode({[1]=1, [2]=2}) [1,2] > json.encode({1,2,3}) [1,2,3]这种情况,只有当table是一个纯数组时,才会转换成 sparse array,否则都记为 object,这样就和其他json化工具很像了, 比如php的json_encode