您的位置:

luacjson——Lua中的JSON解析和编码库

一、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)
luacjson——Lua中的JSON解析和编码库

2023-05-17
使用Lua编写JSON解析器

2023-05-17
json转lua的小工具,lua读取json文件

2022-11-24
lua获取json,lua获取json数组

本文目录一览: 1、【Lua】cjson解析null 2、纯lua判断字符串是否是规范的json格式 3、lua接收到的结构体,如何传给C/C++,并解析成json字符串 4、lua里怎样把一段字符串

2023-12-08
core解析json的笔记(c json解析)

本文目录一览: 1、如何解析json中map数据 2、fasterxml.jackson.core.jsonparser.feature是哪个jar包的 3、spring mvc 怎么获取json 4

2023-12-08
数据库的笔记mysql,数据库管理系统笔记

2022-11-24
复杂json源码,复杂json数组解析

2022-11-24
c语言实现lua表,lua调用c#

2023-01-04
java学习笔记(java初学笔记)

2022-11-14
python基础学习整理笔记,Python课堂笔记

2022-11-21
java方法整理笔记(java总结)

2022-11-08
cjson解析库(cjson解析数组)

本文目录一览: 1、【Lua】cjson解析null 2、cjson嵌套多少层 3、请教Qt如何解析出Json的数据 4、有哪些 C++ 的 JSON 库比较好 【Lua】cjson解析null 最近

2023-12-08
印象笔记记录java学习(Java成长笔记)

2022-11-12
java客户端学习笔记(java开发笔记)

2022-11-14
Jansson:C语言中的JSON编解码库

2023-05-24
python库的解析,python里的库

2022-11-20
重学java笔记,java笔记总结

2022-11-23
深入解析Lua包管理工具——Luarocks

2023-05-16
lua和js哪个好(lua有类吗)

本文目录一览: 1、js原型链与lua元表的异同? 2、游戏一般用什么编程语言开发? 3、javascript和LUA这两个脚本语言哪个强一些? 4、cocos js对比lua的优势? 5、大型的单机

2023-12-08
php中json编码与解码,php json中文乱码

本文目录一览: 1、如何解决php中json 2、php解析json数据 3、如何使用PHP语言来编码和解码JSON对象 4、PHP 如何读取如下的JSON数据? 如何解决php中json json_

2023-12-08