Toggle navigation
首页
(current)
问答
文章
话题
商城
登录
注册
10、合宙Air模块Luat开发:JSON字符串的生成与解析
Air720SL
LUAT
二次开发
教程
JSON
# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) 本系列博客,理论上适用于合宙的`Air202、Air268、Air720x、Air720S`以...
# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) 本系列博客,理论上适用于合宙的`Air202、Air268、Air720x、Air720S`以及最近发布的`Air720U`(我还没拿到样机,应该也能支持)。 先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。 我使用的是`Air720SL`模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考! # 一、前言 ## 1.1、什么是JSON ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403101834483.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) `JSON`(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格式。JSON是基于文本的,轻量级的,通常被认为易于读/写。 虽然与 JavaScript 紧密相连,但 JSON 与语言无关。虽然是独立的,但 JSON 使用与其他语言类似的约定(例如,C,C ++,Java,Perl ,Lua和 Python),使 JSON 成为理想的数据交换语言。 ## 1.2、为什么要学习JSON 由于JSON轻量化并且易于使用,在客户端和服务器交换数据用的比较多。 在阿里云的物联网平台,设备如果想要上报数据给云平台那就要使用的就是JSON字符串。还有一些http请求的API接口,比如京东的天气API数据请求后返回的数据也是JSON字符串。JSON的用法还有很多,这里就不一一举例了。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403101917869.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) # 二、判断一个字符串是不是JSON 以前用过JSON的同学可能一眼就能看出来下面的JSON字符串格式是不是正确的。就算没有学过JSON的同学也能大概猜出来下面这串字符串里面包含了什么信息,格式到底有没有错误那也许就不知道了。 ```javascript { "KEY3": "VALUE3", "KEY4": "VALUE4", "KEY2": "VALUE2", "KEY1": "VALUE1", "KEY5": { "KEY5_2": "VALU5_2", "KEY5_1": "VALU5_1" }, "KEY6": [1, 2, 3] } ``` 要注意的是我们人是高等动物,有智商的,就算这个JSON字符串格式是错的,我们也能得到正确的信息。但是机器不一样,格式错了就是错了,一旦使用了错误的JSON字符串那就会导致程序崩溃,无法解析出来正确的数据。 所以我们需要在实验之前验证一下这个JSON字符串格式是不是正确的,只需百度搜索`JSON在线解析`就能得到如下结果。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403114814836.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) 选择第一个就行,进去一探究竟。复制上面给出的JSON字符串,粘贴在左边的输入框,右边的输入框立即解析出结果,并没有报错,那就说明这个JSON字符串的格式是正确的。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403103942690.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) # 三、编写测试程序 ## 3.1、转化格式 想要把上面的字符串给模块解析,需要经过三个步骤,修改JSON为LUA解释器所能识别的格式。 第一步:复制json到代码中给整个字符串加上双引号 ```c local origin = "{ "KEY3": "VALUE3", "KEY4": "VALUE4", "KEY2": "VALUE2", "KEY1": "VALUE1", "KEY5": { "KEY5_2": "VALU5_2", "KEY5_1": "VALU5_1" }, "KEY6": [1, 2, 3] }" ``` 第二步:给`字符串内`的每个双引号加上转义字符(字符串内不包含首尾的双引号)。 ```c local origin = "{ \"KEY3\": \"VALUE3\", \"KEY4\": \"VALUE4\", \"KEY2\": \"VALUE2\", \"KEY1\": \"VALUE1\", \"KEY5\": { \"KEY5_2\": \"VALU5_2\", \"KEY5_1\": \"VALU5_1\" }, \"KEY6\": [1, 2, 3] }" ``` 第三步:删除所有的回车换行以及空格,将字符串合并成一行 ```c local origin = "{\"KEY3\": \"VALUE3\",\"KEY4\": \"VALUE4\",\"KEY2\": \"VALUE2\",\"KEY1\": \"VALUE1\",\"KEY5\": {\"KEY5_2\": \"VALU5_2\",\"KEY5_1\": \"VALU5_1\"},\"KEY6\": [1, 2, 3]}" ``` ## 3.2、编写JSON解析程序 ```c local origin = "{\"KEY3\": \"VALUE3\",\"KEY4\": \"VALUE4\",\"KEY2\": \"VALUE2\",\"KEY1\": \"VALUE1\",\"KEY5\": {\"KEY5_2\": \"VALU5_2\",\"KEY5_1\": \"VALU5_1\"},\"KEY6\": [1, 2, 3]}" local tjsondata, result, errinfo = json.decode(origin) if result and type(tjsondata) == "table" then log.info("testJson.decode KEY1", tjsondata["KEY1"]) log.info("testJson.decode KEY2", tjsondata["KEY2"]) log.info("testJson.decode KEY3", tjsondata["KEY3"]) log.info("testJson.decode KEY4", tjsondata["KEY4"]) log.info("testJson.decode KEY5", tjsondata["KEY5"]["KEY5_1"], tjsondata["KEY5"]["KEY5_2"]) log.info("testJson.decode KEY6", tjsondata["KEY6"][1], tjsondata["KEY6"][2], tjsondata["KEY6"][3]) else log.info("testJson.decode error", errinfo) end ``` ## 3.3、编写JSON生成程序 ```c local torigin = { KEY1 = "VALUE1", KEY2 = "VALUE2", KEY3 = "VALUE3", KEY4 = "VALUE4", KEY5 = {KEY5_1 = "VALU5_1", KEY5_2 = "VALU5_2"}, KEY6 = {1, 2, 3}, } local jsondata = json.encode(torigin) log.info("testJson.encode", jsondata) ``` # 四、下载完整程序到开发板验证 完整代码在此,自取 ```c --必须在这个位置定义PROJECT和VERSION变量 --PROJECT:ascii string类型,可以随便定义,只要不使用,就行 --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义 PROJECT = "LED" VERSION = "0.0.1" require "sys" --加载日志功能模块,并且设置日志输出等级 --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可 require "log" LOG_LEVEL = log.LOGLEVEL_TRACE local function Test_Task() while true do log.info("Test_Task_run", jsondata) sys.wait(2000) end end local function user_main() sys.wait(10000) sys.taskInit(Test_Task) local origin = "{\"KEY3\": \"VALUE3\",\"KEY4\": \"VALUE4\",\"KEY2\": \"VALUE2\",\"KEY1\": \"VALUE1\",\"KEY5\": {\"KEY5_2\": \"VALU5_2\",\"KEY5_1\": \"VALU5_1\"},\"KEY6\": [1, 2, 3]}" local tjsondata, result, errinfo = json.decode(origin) if result and type(tjsondata) == "table" then log.info("testJson.decode KEY1", tjsondata["KEY1"]) log.info("testJson.decode KEY2", tjsondata["KEY2"]) log.info("testJson.decode KEY3", tjsondata["KEY3"]) log.info("testJson.decode KEY4", tjsondata["KEY4"]) log.info("testJson.decode KEY5", tjsondata["KEY5"]["KEY5_1"], tjsondata["KEY5"]["KEY5_2"]) log.info("testJson.decode KEY6", tjsondata["KEY6"][1], tjsondata["KEY6"][2], tjsondata["KEY6"][3]) else log.info("testJson.decode error", errinfo) end local torigin = { KEY1 = "VALUE1", KEY2 = "VALUE2", KEY3 = "VALUE3", KEY4 = "VALUE4", KEY5 = {KEY5_1 = "VALU5_1", KEY5_2 = "VALU5_2"}, KEY6 = {1, 2, 3}, } local jsondata = json.encode(torigin) log.info("testJson.encode", jsondata) end --启动系统框架 sys.taskInit(user_main) sys.init(0, 0) sys.run() ``` 下载完成后打开监视功能,JSON解析成功同时JSON生成也成功没有发送报错 ```c [2020-04-03 11:17:35.561] [2020-04-03 11:17:35.567] [I]-[testJson.decode KEY1] VALUE1 [2020-04-03 11:17:35.571] [I]-[testJson.decode KEY2] VALUE2 [2020-04-03 11:17:35.584] [I]-[testJson.decode KEY3] VALUE3 [2020-04-03 11:17:35.594] [I]-[testJson.decode KEY4] VALUE4 [2020-04-03 11:17:35.599] [I]-[testJson.decode KEY5] VALU5_1 VALU5_2 [2020-04-03 11:17:35.609] [I]-[testJson.decode KEY6] 1 2 3 [2020-04-03 11:17:35.614] [I]-[testJson.encode] {"KEY6":[1,2,3],"KEY3":"VALUE3","KEY4":"VALUE4","KEY2":"VALUE2","KEY1":"VALUE1","KEY5":{"KEY5_2":"VALU5_2 [2020-04-03 11:17:35.619] ","KEY5_1":"VALU5_1"}} ``` > 不会下载的[点击这里](https://blog.csdn.net/weixin_44570083/article/details/104285283),进去查看我的第二篇博文`2、Air720SL模块Luat开发:第一个Luat的Hello World`里面讲了怎么下载 > 这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束
发表于 2020-04-03 11:28
阅读 ( 2274 )
3 推荐
收藏
你可能感兴趣的文章
13、RDA8910CSDK二次开发:将你的代码藏起来----编译静态库
5367 浏览
3、RDA8910CSDK二次开发:GPIO输入详解
2024 浏览
11、合宙Air模块Luat开发:通过http协议获取天气信息
2415 浏览
9、合宙Air模块Luat开发:认识NVS数据管理模块
1983 浏览
8、合宙Air模块Luat开发:基于官方库的二次封装,使串口更加易用
2531 浏览
相关问题
Air720SL的I2C及I2C2对应设备ID是?如何使用api读写16位地址寄存器
0 回答
关于二次开发功能上的咨询
1 回答
Air208编程
1 回答
Air202设置闹钟“AT+CALA=?”
2 回答
Air202 MQTT如何发送USERNAME PASSWORD ID ?
1 回答
Air200关于SW_DEFAULT_1.0.2_Luat_V0013_Air200_SSL.lod的问题
1 回答
0 条评论
请先
登录
后评论
陈夏
26 篇文章
作家榜
»
技术销售Delectate
43 文章
陈夏
26 文章
国梁
24 文章
miuser
21 文章
晨旭
20 文章
朱天华
19 文章
金艺
19 文章
杨奉武
18 文章
×
发送私信
发给:
内容:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!