json数据处理
一、JSON 介绍
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 编程语言的一个子集,但独立于语言,广泛用于不同编程环境中。
1.1 JSON 的基本结构
1.1.1 对象
由花括号 {}
包围,包含键值对。键是字符串,值可以是字符串、数字、布尔值、数组、对象或 null
。 { "name": "Alice", "age": 30, "isStudent": false }
1.1.2 数组
由方括号 []
包围,包含一个有序的值列表。值可以是任何类型的数据,包括对象和其他数组。 [ "apple", "banana", "cherry" ]
1.2 JSON 的优点
简洁性:结构简单,易于理解和使用。
可移植性:语言无关,几乎所有的编程语言都支持 JSON 解析和生成。
灵活性:适用于各种数据结构的表示。
1.3 常用场景
Web 应用:用于客户端与服务器之间的数据交换。
配置文件:用于应用程序的配置设置。
数据存储:用于存储简单的数据结构。
综上所述,JSON 因其简单和灵活的特性,已经成为现代编程中数据交换的标准格式之一。
二、演示功能概述
本文使用 Air780EP 核心板,生成与解析 JSON 格式数据,并通过日志观察实验结果。
三、准备硬件环境
参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。
四、软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
1. Luatools工具;
2. 内核固件文件(底层core固件文件):LuatOS-SoC_V2002_Air780EP;参考项目使用的内核固件;
3. luatos需要的脚本和资源文件
脚本和资源文件右键点我,另存为,下载完整压缩文件包
lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到Air780EP核心板,将本篇文章中演示使用的项目文件烧录到Air780EP核心板中。
五、代码示例介绍
5.1 完整程序清单
注:完整复制后保存为 main.lua,可直接使用
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "jsondemo"
VERSION = "1.0.0"
-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
log.info("main", PROJECT, VERSION)
-- json库支持将 table 转为 字符串, 或者反过来, 字符串 转 table
-- 若转换失败, 会返回nil值, 强烈建议在使用时添加额外的判断
sys.taskInit(function()
while 1 do
sys.wait(1000)
-- table 转为 字符串
local t = {abc=123, def="123", ttt=true}
local jdata = json.encode(t)
log.info("json", jdata) --日志输出:{"ttt":true,"def":"123","abc":123}
-- 字符串转table
local str = "{\"abc\":1234545}" -- 字符串可以来源于任何地方,网络,文本,用户输入,都可以
local t = json.decode(str)
if t then
-- 若解码成功,t不为nil
log.info("json", "decode", t.abc) --日志输出:decode 1234545
else
-- 若解码失败,t为nil
log.info("json", "decode failed")
end
-- lua中的table是 数组和hashmap的混合体
-- 这对json来说会有一些困扰, 尤其是空的table
local t = {abc={}}
-- 假设从业务上需要输出 {"abc":[]}
-- 实际会输出 {"abc": {}} , 空table是优先输出 hashmap (即字典模式)形式, 而非数组形式,Lua语言中数组优先级低于hashmap优先级
log.info("json", "encode", json.encode(t)) --日志输出:encode {"abc":{}}
-- 混合场景, json场景应避免使用
t.abc.def = "123"
t.abc[1] = 345
-- 输出的内容是 {"abc":{"1":345,"def":"123"}}
log.info("json", "encode2", json.encode(t)) --日志输出:encode2 {"abc":{"1":345,"def":"123"}}
-- 浮点数演示
log.info("json", json.encode({abc=1234.300}))--日志输出:{"abc":1234.300}
-- 限制小数点到1位
log.info("json", json.encode({abc=1234.300}, "1f")) --日志输出:{"abc":1234.3}
local tmp = "ABC\r\nDEF\r\n"
local tmp2 = json.encode({str=tmp}) --在JSON中,\r\n 被保留为字符串的一部分
log.info("json", tmp2) --日志输出:{"str":"ABC\r\nDEF\r\n"}
local tmp3 = json.decode(tmp2)
log.info("json", "tmp3", tmp3.str, tmp3.str == tmp) --日志输出:tmp3 ABC
--DEF
-- true 注:true前存在一个TAB长度(这个TAB原因未知,但不影响使用)
-- break
log.info("json.null", json.encode({name=json.null})) --日志输出:{} 为空对象
log.info("json.null", json.decode("{\"abc\":null}").abc == json.null) --日志输出:false 在 Lua 中,nil 是一种特殊类型,用于表示“无值”或“未定义”。它与任何其他值(包括自定义的 json.null)都不相等
log.info("json.null", json.decode("{\"abc\":null}").abc == nil) --日志输出:false
end
end)
-- 这里演示4G模块上网后,会自动点亮网络灯,方便用户判断模块是否正常开机
sys.taskInit(function()
while true do
sys.wait(6000)
if mobile.status() == 1 then
gpio.set(27, 1)
else
gpio.set(27, 0)
end
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
六、功能验证
6.1 开机
6.2 观察输出
总结
至此,我们已使用 Air780EP 开发板验证了 JSON 编、解码功能。
给读者的话
本篇文章由
肇朔
开发;本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
请登录合宙技术交流论坛,点击文档找错赢奖金-Air780EP-LuatOS-软件指南-通用工具库-json数据处理
用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金!