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 因其简单和灵活的特性,已经成为现代编程中数据交换的标准格式之一。
二、演示功能概述
本文使用 Air201模组,生成与解析 JSON 格式数据,并通过日志观察实验结果。
三、准备硬件环境
3.1 Air201 模组
点击链接购买:合宙Air201模组淘宝购买链接 ;
此模组的详细使用说明参考:Air201 产品手册 。
3.2 TYPE-C 数据线
购买链接(注意:必须具备USB通信功能的TYPE-C数据线!)
四、准备软件环境
4.1 Luatools
4.2 core 固件和源码脚本
注:core 固件,是基础环境,该固件由合宙官方提供,用户不可修改;源码脚本,为应用程序,可由客户自行修改; 右键点我,另存为,下载完整压缩文件包
五、软硬件资料
1、此模组的详细使用说明参考:Air201 产品手册
5.1 开发板按钮与指示灯图示与说明
5.2 硬件安装与连接
5.2.1 SIM 卡安装
5.2.2 实物连接图
注:开发板与电脑通过 TYPE-C 线连接,用于通信与供电,所以必须使用支持USB通信的 TYPE-C 线才可以;
六、代码示例介绍
6.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
log.info("json.null", json.encode({name=json.null})) --日志输出:{"name":null}
log.info("json.null", json.decode("{\"abc\":null}").abc == json.null) --日志输出:true
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.setup(1, 1, gpio.PULLUP)
else
gpio.setup(1, 0, gpio.PULLUP)
mobile.reset()
end
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
七、功能验证
7.1 开机
按图 1 所示通过 TYPE-C 线将开发板与电脑连接无误后,此时按下开机键,约 2 秒后释放,等待几秒蓝色指示灯常亮,即开机并联网成功,如下图:
此时电脑设备管理器中会发现下图所示几个设备,即代表开机成功!
7.2 打开 Luatool 软件工具并进入项目管理测试页面
7.3 按序号步骤创建项目
7.4 按如下步骤进行程序烧录
Air201进入boot下载模式,烧录固件和程序,需要将预留的测试点(Air201板子 B面图) 的BOOT 上拉到vdd_ext(A面USB旁边),之后上电开机,即可进入下载模式,下载完程序后将boot脚悬空。
Air201板子 A面图
Air201板子 B面图
判断是否进入 BOOT 模式:模块上电,此时在电脑的设备管理器中,查看串口设备, 会出现一个端口表示进入了 BOOT 下载模式,如下图所示:
7.5 观察下载过程后确认烧录结果
下载中
下载成功
7.6 关闭项目管理界面,回到调试页面,观察输出
总结
至此,我们已使用 Air780E 开发板验证了 JSON 编、解码功能。