您的位置:首页 > 运维架构 > Linux

linux下编译使用lua及cjson

2017-07-17 17:52 1226 查看
 


linux下编译使用lua及cjson

2016-04-05 23:51 2534人阅读 评论(0) 收藏 举报


 分类:

linux/centos(11) 

 skynet/lua(13) 


版权声明:本文为“没有开花的树”原创文章,未经博主允许不得转载。

目录(?)[+]

前面的文章记录了lua的编译和使用,这里再整理一下,侧重说明下lua json库的编译及使用,文章最后再谈下cjson使用中有可能遇到的excessively sparse array 问题及解决方法。


lua编译

lua的源代码安装过程挺简单的,以lua5.3为例

[plain] view
plain copy

# 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库,编译过程如下:

[plain] view
plain copy

# 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库目录

[plain] view
plain copy

# cp cjson.so /usr/local/lib/lua/5.3  

# chmod 755 /usr/local/lib/lua/5.3/cjson.so  


lua使用json

现在,简单测试下lua及cjson的使用。

[plain] view
plain copy

# /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库在使用中经常有遇到这个问题,这个问题其实很好解决。

[plain] view
plain copy

> 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倍时,就会报这个错误。
另外,还有可能出现下面这种情况。

[plain] view
plain copy

> json.encode({[10]=1})  

[null,null,null,null,null,null,null,null,null,1]  

这里,cjson提供了接口解决这个问题,也就是  json.encode_sparse_array(true,1) 

[plain] view
plain copy

# /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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: