前面的文章记录了lua的编译和使用,这里再整理一下,侧重说明下lua json库的编译及使用,文章最后再谈下cjson使用中有可能遇到的excessively sparse array 问题及解决方法。
lua编译
lua的源代码安装过程挺简单的,以lua5.3为例
# 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
注意了,lua没有 ./configure 这个命令,需要编辑配置可修改 Makefile,例如 INSTALL_BIN,默认是 /usr/local/bin, 表示安装后lua命令就是 /usr/local/bin/lua
lua编译过程出现异常,最常见有3个:
1. 缺少readline,显示error: readline/readline.h: No such file or directory ...
2. 缺少ncurses,显示 libreadline.so: undefined reference to `PC' ...
3. 整数编译报错,显示 Compiler does not support 'long long ...
cjson编译
cjson是lua使用广泛的json库,编译过程如下:
# 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
然后,将cjson库加到lua库目录
# cp cjson.so /usr/local/lib/lua/5.3
# chmod 755 /usr/local/lib/lua/5.3/cjson.so
lua使用json
现在,简单测试下lua及cjson的使用。
# /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"}
cjson的优缺点:
优点:快,支持utf8,没有其他库依赖,MIT开源
缺点:不支持utf16及utf32,2012年之后就没更新了
cjson常见问题
1. excessively sparse array 问题
cjson库在使用中经常有遇到这个问题,这个问题其实很好解决。
> 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]
这里,cjson提供了接口解决这个问题,也就是 json.encode_sparse_array(true,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
参考:http://blog.csdn.net/mycwq/article/details/51069297
分享到:
相关推荐
为了在Windows环境下使用lua-cjson,你需要: - 安装一个C编译器,例如Visual Studio。 - 解压"lua-cjson.7z"并打开工程文件,编译生成cjson库。 - 将生成的库文件(.dll或.lib)放在适当的位置,以便Lua能找到。 - ...
- 包含的`cJSON-master`压缩包中可能包含测试用例,这些用例展示了如何使用cJson库进行解析和生成操作。通过运行测试用例,你可以了解cJson库的实际使用方式并验证其功能是否正常。 5. **整合到项目中** - 将`...
在Linux环境下,你可以使用`tar -xvf lua-5.3.5.tar`命令来解压,然后通过编译源代码安装Lua。编译通常涉及`./configure`、`make`和`make install`这三个步骤,这将使你在系统上构建和安装Lua解释器。 “lua环境...
CJSON是Lua的JSON编码/解码库,下载`lua-cjson`的源代码,解压后修改`Makefile`中的`LUA_VERSION`、`LUA_INCLUDE_DIR`和`LUA_CMODULE_DIR`以指向LuaJIT的安装位置,然后执行`make`和`sudo make install`。...
关于Webbench,这是一个在Linux环境下使用的网站压力测试工具,它可以模拟成千上万的客户端并发访问特定URL。Webbench使用C语言编写,并且代码量不大,适合学习如何编写高效的程序。它通过fork()系统调用创建多个...