[关闭]
@wsd1 2017-01-19T08:01:46.000000Z 字数 1659 阅读 2278

【专题8】Skynet添加cjson支持

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);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注