@wsd1
2017-01-19T08:01:46.000000Z
字数 1659
阅读 2719
skynet
Skynet历史上曾经支持json作为gate的基本格式,我们直接从历史中取得cjson2.1版本。
导出2015年5月份的版本,该版本将采用json作为客户端通讯的基础格式,之后一个版本就换成了sproto的格式了。
git checkout 66a0a6e1db0e8dbcb9d9e55d0d4a3c2a31796e08
去 3rd/ 目录拷贝出 lua-cjson 目录,以及 Makefile 文件。和两个demo代码文件: examples\client.lua与 lualib\jsonpack.lua
回到最新版本skynet
git checkout master
放置 lua-cjson 到3rd/ 路径下,然后去修改Makefile。拷贝出来的Makefile文件中,已经有对其的支援。
主要包括:
LUA_CLIB = skynet socketdriver .......添加 cjson
添加一行:
$(LUA_CLIB_PATH)/cjson.so : | $(LUA_CLIB_PATH)
cd 3rd/lua-cjson && $(MAKE) LUA_INCLUDE_DIR=../../$(LUA_INC) CC=$(CC) CJSON_LDFLAGS="$(SHARED)" && cd ../.. && cp 3rd/lua-cjson/cjson.so $@
尾部cleanall位置加上:
cd 3rd/lua-cjson && $(MAKE) clean
如此,回到skynet路径下,make linux 便可以看到有warning出现,但是不要紧,去 luaclib目录便可以看到 cjson.so。
至于如何使用,可以参考 拷贝出来的两个文件: examples\client.lua lualib\jsonpack.lua
另外,也可以在test目录下新建 cjson_test.lua文件:
local skynet = require "skynet"
local cjson = require "cjson"
local sampleJson = [[{"age":"23","testArray":{"array":[8,9,11,14,25]},"Himi":"himigame.com"}]];
skynet.start(function()
print("Before test")
--解析json字符串
local data = cjson.decode(sampleJson);
--打印json字符串中的age字段
print(data["age"]);
--打印数组中的第一个值(lua默认是从0开始计数)
print(data["testArray"]["array"][1]);
print("End test")
end)
运行skynet:
./skynet example/config
再输入 cjson_test ,便可以看到结果。
再来一个:
local skynet = require "skynet"
local cjson = require "cjson"
local retTable = {}; --最终产生json的表
--顺序数值
local intDatas = {};
intDatas[1] = 100;
intDatas[2] = "100";
--数组
local aryDatas = {};
aryDatas[1] = {};
aryDatas[1]["键11"] = "值11";
aryDatas[1]["键12"] = "值12";
aryDatas[2] = {};
aryDatas[2]["键21"] = "值21";
aryDatas[2]["键22"] = "值22";
--对Table赋值
retTable["键1"] = "值1";
retTable[2] = 123;
retTable["int_datas"] = intDatas;
retTable["aryDatas"] = aryDatas;
--将表数据编码成json字符串
local jsonStr = cjson.encode(retTable);
print(jsonStr);