Lua-cjson使用笔记

LuaCJSON模块为Lua提供了JSON支持,这篇记录一下cjson的使用过程

环境和注意事项

环境为CentOS和Lua 5.1.4,该模块的主要功能自然是在Lua中完成Json值的编码和解码

注:lua-cjson要求编码格式为UTF8,不支持UTF16和UTF32

安装、编译

先将lua-cjson拉下来

git clone https://github.com/mpx/lua-cjson

如果上面加载不出来可以试试我这个,转到码云的链接了

git clone https://gitee.com/Nicer_feng/lua-cjson.git

下载以后进入lua-cjson目录编译

[root@feng1 ~]# cd lua-cjson/

[root@feng1 lua-cjson]# make

cc -c -O3 -Wall -pedantic -DNDEBUG -I/root/lua/include -fpic -o lua_cjson.o lua_cjson.c

In file included from /root/lua/include/lua.h:16:0,

from lua_cjson.c:43:

/root/lua/include/luaconf.h:562:27: warning: ISO C90 does not support ‘long long’ [-Wlong-long]

#define LUA_INTEGER long long

^

/root/lua/include/lua.h:91:9: note: in expansion of macro ‘LUA_INTEGER’

typedef LUA_INTEGER lua_Integer;

^

/root/lua/include/luaconf.h:562:27: warning: ISO C90 does not support ‘long long’ [-Wlong-long]

#define LUA_INTEGER long long

^

/root/lua/include/luaconf.h:530:22: note: in expansion of macro ‘LUA_INTEGER’

#define LUAI_UACINT LUA_INTEGER

^

/root/lua/include/luaconf.h:536:32: note: in expansion of macro ‘LUAI_UACINT’

#define LUA_UNSIGNED unsigned LUAI_UACINT

^

/root/lua/include/lua.h:94:9: note: in expansion of macro ‘LUA_UNSIGNED’

typedef LUA_UNSIGNED lua_Unsigned;

^

cc -c -O3 -Wall -pedantic -DNDEBUG -I/root/lua/include -fpic -o strbuf.o strbuf.c

cc -c -O3 -Wall -pedantic -DNDEBUG -I/root/lua/include -fpic -o fpconv.o fpconv.c

cc -shared -o cjson.so lua_cjson.o strbuf.o fpconv.o

一堆报错但好像还是生成了这个东西,我们find一下发现lua5.1和5.3好像本身就自带这个东西,得到了一个叫cjson.so的可执行文件,我们写一个代码来测试一下这个东西的使用

测试

testjson.lua

local cjson = require "cjson"

-- 创建实例

local cjson2 = cjson.new()

-- 布尔类型

local lua_bool = true

print(cjson2.encode(lua_bool))

-- 数组类型

local lua_array = {1, 2, 3, 4, 5, 6}

print(cjson2.encode(lua_array))

-- 数值类型

local lua_number = 6.66

print(cjson2.encode(lua_number))

-- 字符串类型

local lua_string = "I am lua-ejson"

print(cjson2.encode(lua_string))

-- 对象类型

local lua_object = {

["name"] = "feng",

["age"] = 23,

["addr"] = "GuangZhou",

["email"] = "feng9662@qq.com",

["tel"] = "18866668888"

}

print(cjson2.encode(lua_object))

local msg = {

_cmd = "balllist",

balls = {

[1] = {id=102, x=10, y=20, size=1},

[2] = {id=103, x=10, y=30, size=2},

}

}

local buff = cjson.encode(msg)

print(buff)

我们直接把生成的cjson.so复制到testjson.lua文件夹下,编译试试

[root@feng1 lua-cjson]# cp /root/lua-cjson/cjson.so /study/lua-cjson_demo/

[root@feng1 lua-cjson]# cd /study/lua-cjson_demo/

[root@feng1 lua-cjson_demo]# ll

total 48

-rwxr-xr-x 1 root root 41304 Nov 3 15:39 cjson.so

-rw-r--r-- 1 root root 827 Nov 3 15:39 testjson.lua

[root@feng1 lua-cjson_demo]# LUA_CPATH=/study/lua-cjson_demo/cjson.so lua testjson.lua

true

[1,2,3,4,5,6]

6.66

"I am lua-ejson"

{"addr":"GuangZhou","name":"feng","tel":"18866668888","age":23,"email":"feng9662@qq.com"}

{"balls":[{"id":102,"x":10,"y":20,"size":1},{"id":103,"x":10,"y":30,"size":2}],"_cmd":"balllist"}

[root@feng1 lua-cjson_demo]#

可以发现转化成功了,decode也就省略了,在使用过程中报错如下

报错

[root@feng1 lua-cjson_demo]# LUA_CPATH=/study/lua-cjson_demo/cjson.so lua testjson.lua

lua: error loading module 'cjson' from file '/study/lua-cjson_demo/cjson.so':

/study/lua-cjson_demo/cjson.so: undefined symbol: luaL_setfuncs

stack traceback:

[C]: ?

[C]: in function 'require'

testjson.lua:1: in main chunk

[C]: ?

是因为我控制台使用的lua为5.1的版本,而cjson.so用了5.3编译的包,导致加载错误,换了一个cjson.so即可编译成功

实际使用

实际项目中使用这个包只需要把编译好的cjson.so复制到项目中luaclib即可使用

查看原文