前面的文章记录了lua的编译和使用,这里再整理一下,侧重说明下lua json库的编译及使用,文章最后再谈下cjson使用中有可能遇到的excessively sparse array 问题及解决方法。
lua编译
lua的源代码安装过程挺简单的,以lua5.3为例
# wget http://www.lua.org/ftp/lua-5.3.2.tar.gz
# tar -zxf lua-5.3.2.tar.gz
# cd lua-5.3.2
# make linux
# make install
注意了,lua没有 ./configure 这个命令,需要编辑配置可修改 Makefile,例如 INSTALL_BIN,默认是 /usr/local/bin, 表示安装后lua命令就是 /usr/local/bin/lua
lua编译过程出现异常,最常见有3个:
1. 缺少readline,显示error: readline/readline.h: No such file or directory ...
2. 缺少ncurses,显示 libreadline.so: undefined reference to `PC' ...
3. 整数编译报错,显示 Compiler does not support 'long long ...
cjson编译
cjson是lua使用广泛的json库,编译过程如下:
# wget http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
# tar -zxf lua-cjson-2.1.0.tar.gz
# cd lua-cjson-2.1.0
# make all
然后,将cjson库加到lua库目录
# cp cjson.so /usr/local/lib/lua/5.3
# chmod 755 /usr/local/lib/lua/5.3/cjson.so
lua使用json
现在,简单测试下lua及cjson的使用。
# /usr/local/bin/lua
Lua 5.3.2 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> cjson = require "cjson"
> json = cjson.new()
> json_text = '{ "foo": "bar" }'
> value = json.decode(json_text)
> for k,v in pairs(value) do print("json", k, v) end
json foo bar
> list = { foo = "bar" }
> return json.encode(list)
{"foo":"bar"}
cjson的优缺点:
优点:快,支持utf8,没有其他库依赖,MIT开源
缺点:不支持utf16及utf32,2012年之后就没更新了
cjson常见问题
1. excessively sparse array 问题
cjson库在使用中经常有遇到这个问题,这个问题其实很好解决。
> json.encode({[11]=1})
stdin:1: Cannot serialise table: excessively sparse array
stack traceback:
[C]: in field 'encode'
stdin:1: in main chunk
[C]: in ?
如果所有的key都是数字,cjson会使用类似数组的形式来记录数据,记为sparse array,这种形式的好处是减少key占用的字符串大小。但是,当最大的key大于10,并且超过了元素个数的2倍时,就会报这个错误。
另外,还有可能出现下面这种情况。
> json.encode({[10]=1})
[null,null,null,null,null,null,null,null,null,1]
这里,cjson提供了接口解决这个问题,也就是 json.encode_sparse_array(true,1)
# /usr/local/bin/lua
> cjson = require "cjson"
> json = cjson.new()
> json.encode_sparse_array(true,1)
true 1 10
> json.encode({[11]=1})
{"11":1}
> json.encode({[2]=1})
{"2":1}
> json.encode({[1]=1, [2]=2})
[1,2]
> json.encode({1,2,3})
[1,2,3]
这种情况,只有当table是一个纯数组时,才会转换成sparse array,否则都记为 object,这样就和其他json化工具很像了,比如php的json_encode
参考:http://blog.csdn.net/mycwq/article/details/51069297
分享到:
相关推荐
下载完成后,解压到本地目录,你会看到lua_cjson_2.1.0这个文件夹,其中包含了所有必要的源代码和编译所需的配置文件。 编译lua_cjson涉及以下步骤: 1. 打开Visual Studio 2013。 2. 创建一个新的C++项目,选择Win...
编译好的lua-cjson.dll,亲测可用。 版本:lua-cjson-2.1.0 git地址:https://github.com/openresty/lua-cjson lua json库官方比较:http://lua-users.org/wiki/JsonModules
`lua-cjson`是Lua编程语言中一个高效且功能丰富的JSON(JavaScript Object Notation)解析和序列化库,版本2.1.0提供了稳定性和性能上的优化。这个库使得在Lua环境中处理JSON数据变得异常简单,尤其在Web开发中,如...
2. `lua_cjson.luac` 或 `lua_cjson.lua`:这是Lua源代码或预编译的脚本,定义了如何在Lua环境中使用cjson模块。 3. `README`:包含库的使用说明、安装指南和许可信息。 4. `LICENSE`:库的授权协议,规定了用户可以...
在CMakeLists.txt中,lua-cjson的构建配置已经定义好,包括所需的lua库和编译选项。 3. **生成VS2013项目文件**: 在CMake中选择Visual Studio 2013作为生成器,然后点击“Configure”,接着点击“Generate”生成...
找了老半天都没有windows版本的cjson.dll库,只能手动编译。 下载:http://www.kyne.com.au/~mark/software/lua-cjson.php 转换为vs2005工程后编译出错,把所有static inline的函数修改为static的,把一些不...
用户只需将这个.dll文件放置在Lua的安装目录下的"clibs"子目录中,无需进行额外的编译步骤,即可直接在Lua环境中使用。这为开发者提供了便利,因为他们可以快速地在自己的项目中集成cjson库,而无需关心编译细节。 ...
cjson 在windows 平台的编译工程,找了很多都没有,下载没有积分,只好自己动手了,测试通过的,里面包含了lua_cjson 的源码,解压后进入目录,build 文件夹下的 sln 解决方案,打开即可,也有已经生成的 cjson.lib ...
6. **在Java代码中调用**:最后,在Java代码中,你可以使用`System.loadLibrary("lua")`和`System.loadLibrary("lua_cjson")`来加载这两个库,并通过JNI接口调用Lua和lua_cjson的功能。 通过以上步骤,你就成功地在...
lua-cjson win32版本的dll,照着教程用mingw编译出来了。但是项目需要x64的,没成功,用vs2015重新编译成功了,改了一些报错。基于 lua5.3.5
4. 编译并链接修改后的lua-cjson库,然后在你的项目中使用这个定制版的库。 请注意,这样做可能会打破一些期望`nil`的行为,因为在Lua中,`nil`和任何值都不相等,而`"null"`字符串与其他字符串或变量可以进行比较...
cjson.dll 需要lua5.1.dll 调用require “cjson” cjson.dll 需要lua5.1.dll 调用require “cjson”
lua第三方库cjson-2.1.0, 编译不易, 在此提供快捷下载, 下载后置于%lua_home%/clibs中 可能需要重启电脑 可参见文章自行编译:https://blog.csdn.net/qq_35566365/article/details/88625009
Lua CJSON 为 Lua 语言提供高性能的 JSON 解析器和编码器,其性能比纯 Lua 库要高 10 到 20 倍。Lua CJSON 完全支持 UTF-8 ,无需依赖其他非 Lua/LuaJIT 的相关包。
lua-cjson 是一个简单小巧的开源动态库,可被 Lua 脚本 require 加载在 Lua 中通过一系列的 lua-cjson API 调用完成 Lua 值与 Json 值的相互转换(编码及解码)。 使用方式参考:...
将`bit.dll`和`cjson.dll`复制到Lua的`clibs`目录下,意味着这些库可以被Lua解释器自动加载。在运行Lua脚本时,只要正确地require这两个库,就可以直接在脚本中使用它们提供的功能。例如,引入`bit`库后,可以进行...
window下的lua-cjson.dll window下的lua-cjson.dll window下的lua-cjson.dll window下的lua-cjson.dll
在Linux环境下,Lua是一种轻量级的脚本语言,常被用作嵌入式编程,游戏开发,服务器脚本等场景。这篇描述提及的是已经成功在Linux系统上编译通过的Lua库,版本为5.1.4。Lua 5.1.4是该语言的一个稳定版本,发布于2009...
为了在Windows环境下使用lua-cjson,你需要: - 安装一个C编译器,例如Visual Studio。 - 解压"lua-cjson.7z"并打开工程文件,编译生成cjson库。 - 将生成的库文件(.dll或.lib)放在适当的位置,以便Lua能找到。 - ...
这使得从服务器接收到的JSON数据可以直接在Lua中使用,例如`local lua_table = cjson.decode('{"name":"John","age":30}')`,lua_table将是一个包含字段"name"和"age"的Lua表。 3. `safe_decode`:当JSON字符串可能...