一、luacjson编译
luacjson 是一个JSON解析/编码库,并且支持将Lua table 转换为 JSON 格式,同时也能将 JSON 格式的数据转换为 Lua table。操作简单,使用灵活。luacjson库的编译首先需要安装luajit,luajit是一个轻量级的lua解释器。在安装了luajit的前提下,编译cjson库首先要生成Makefile文件:
$ /usr/local/luajit/bin/luarocks make
会自动编译cjson库并把编译生成的cjson.so文件放在luajit-XXX/lib下面,该库可以直接被luajit解释执行。
二、lua cjson性能测试
cjson性能在所有Lua解析器中都是很快的,但是在luajit解析器上达到了最快速度。
local cjson = require "cjson" local util = require "benchmark_util" local json_string = util.file_read_all("sample.json") -- 冷启动环境 cjson.encode({}) cjson.decode("[]") local function test_encode() local json_obj = cjson.decode(json_string) assert(type(json_obj) == "table") local json_str = cjson.encode(json_obj) assert(type(json_str) == "string") end local function test_decode() local json_obj = cjson.decode(json_string) assert(type(json_obj) == "table") end util.result("cjson encode", test_encode, 50) util.result("cjson decode", test_decode, 50)
三、luacjson ndk编译
在Android Studio开发中,使用NDK编译LUA程序时,需要将需要使用的cjson源码放在Android Studio工程目录下,并配置工程编译环境。在安装有NDK的前提下,使用ndk-build编译生成cjson库。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cjson LOCAL_SRC_FILES := lua_cjson.c strbuf.c fpconv.c lzf/lzf_c.c lzf/lzf_d.c LOCAL_SHARED_LIBRARIES := libluajit include $(BUILD_SHARED_LIBRARY)
四、lua cjson库
使用Lua cjson库的流程非常简单,只需调用require即可。
local cjson = require "cjson"
五、lua cjson使用
在使用lua cjson库时,可以将lua table转换为json字符串,也可以将json字符串转换为lua table。下列代码为如何将lua table转换成json字符串:
local cjson = require "cjson" local data = { a = 1, b = "2", c = { d = 3, e = "4" } } local jsonStr = cjson.encode(data) print(jsonStr)
将json字符串转换成lua table:
local cjson = require "cjson" local jsonStr = '{"a":1,"b":"2","c":{"d":3,"e":"4"}}' local data = cjson.decode(jsonStr) print(data.a) --> 1 print(data.b) --> "2" print(data.c.d) --> 3 print(data.c.e) --> "4"
六、lua cjson encode
使用Lua cjson库进行json编码时,一个常见的问题是如何编码数字。cjson默认使用科学计数法来表示到小数后15位以上的数字,但是这个特性并不总是期望的。解决这个问题的方法是在编码之前还需调用cjson.encode_sparse_array(true)。下面的例子展示了编码数字两种不同的方式:
local cjson = require "cjson" -- 方法1:默认情况下使用科学计数法 local data1 = { 1234567890123456789 } local jsonStr1 = cjson.encode(data1) print(jsonStr1) --> [1.23456789012346e+18] -- 方法2:使用 cjson.encode_sparse_array(true) 解决这个问题 cjson.encode_sparse_array(true) local data2 = { 1234567890123456789 } local jsonStr2 = cjson.encode(data2) print(jsonStr2) --> ["1234567890123456789"]
七、lua cjson bigint
在大多数情况下,cjson可以完美地编码整数。然而,有时候我们需要编码超大数字,大于Lua number类型的范围。解决这个问题的办法是在编码之前还需要调用cjson.encode_number_precision(n)方法,并且n要大于等于21。下面的例子展示了如何编码一个逾越15位宽度限制的数字:
local cjson = require "cjson" local val = "12345678901234567890" print(#val) --> 20 cjson.encode_number_precision(21) local encoded_val = cjson.encode(val) print(encoded_val) --> ["12345678901234567890"]
八、lua cjson出错判断
在实际开发过程中,使用cjson时,可能会遇到一些出错的情况。Luacjson在处理JSON字符串时出现重复键的情况时将返回nil,因此需要在代码中进行出错判断。
local cjson = require "cjson" local data = { a = 1, b = "2", a = "3" } local jsonStr = cjson.encode(data) print(jsonStr) -- cjson进行错误处理,不会编码重复的key值 local data2 = { a = 1, b = "2", a = "3" } local jsonStr2 = cjson.encode(data2) if jsonStr2 == nil then print("encode error") else print(jsonStr2) end
九、lua cjson修改json
在实际开发中,需要对JSON格式的数据进行修改,很容易将JSON字符串转换为一个Lua table并进行修改。然后再将该table转换为JSON格式的字符串,用这种方法修改JSON参数不仅简单,而且更加灵活。下面的例子展示如何使用Luajcson修改JSON格式的数据。
local cjson = require "cjson" local jsonStr = '{"a":1,"b":"2","c":{"d":3,"e":"4"}}' local data = cjson.decode(jsonStr) -- 修改值 data.a = 100 data.b = "200" data.c.d = 300 data.c.e = "400" local modifiedStr = cjson.encode(data) print(modifiedStr)