Lua-cjson使用笔记

Lua-cjson使用笔记

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

环境和注意事项

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

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

image-20211103145415805

安装、编译

先将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即可使用

image-20211103155619292

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上上签i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值