分享

合宙Air模块Luat开发:JSON字符串的生成与解析评论分享

 袁先森lemon 2020-10-14

目录

点击这里查看所有博文

  本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。

  先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。

  我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!

一、前言

1.1、什么是JSON

在这里插入图片描述
  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的用法还有很多,这里就不一一举例了。
在这里插入图片描述

二、判断一个字符串是不是JSON

  以前用过JSON的同学可能一眼就能看出来下面的JSON字符串格式是不是正确的。就算没有学过JSON的同学也能大概猜出来下面这串字符串里面包含了什么信息,格式到底有没有错误那也许就不知道了。

  1. {
  2. "KEY3": "VALUE3",
  3. "KEY4": "VALUE4",
  4. "KEY2": "VALUE2",
  5. "KEY1": "VALUE1",
  6. "KEY5": {
  7. "KEY5_2": "VALU5_2",
  8. "KEY5_1": "VALU5_1"
  9. },
  10. "KEY6": [1, 2, 3]
  11. }

  要注意的是我们人是高等动物,有智商的,就算这个JSON字符串格式是错的,我们也能得到正确的信息。但是机器不一样,格式错了就是错了,一旦使用了错误的JSON字符串那就会导致程序崩溃,无法解析出来正确的数据。

  所以我们需要在实验之前验证一下这个JSON字符串格式是不是正确的,只需百度搜索JSON在线解析就能得到如下结果。
在这里插入图片描述
  选择第一个就行,进去一探究竟。复制上面给出的JSON字符串,粘贴在左边的输入框,右边的输入框立即解析出结果,并没有报错,那就说明这个JSON字符串的格式是正确的。
在这里插入图片描述

三、编写测试程序

3.1、转化格式

  想要把上面的字符串给模块解析,需要经过三个步骤,修改JSON为LUA解释器所能识别的格式。

  第一步:复制json到代码中给整个字符串加上双引号

  1. local origin = "{
  2. "KEY3": "VALUE3",
  3. "KEY4": "VALUE4",
  4. "KEY2": "VALUE2",
  5. "KEY1": "VALUE1",
  6. "KEY5": {
  7. "KEY5_2": "VALU5_2",
  8. "KEY5_1": "VALU5_1"
  9. },
  10. "KEY6": [1, 2, 3]
  11. }"

  第二步:给字符串内的每个双引号加上转义字符(字符串内不包含首尾的双引号)。

  1. local origin = "{
  2. \"KEY3\": \"VALUE3\",
  3. \"KEY4\": \"VALUE4\",
  4. \"KEY2\": \"VALUE2\",
  5. \"KEY1\": \"VALUE1\",
  6. \"KEY5\": {
  7. \"KEY5_2\": \"VALU5_2\",
  8. \"KEY5_1\": \"VALU5_1\"
  9. },
  10. \"KEY6\": [1, 2, 3]
  11. }"

  第三步:删除所有的回车换行以及空格,将字符串合并成一行

  1. 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解析程序

  1. local origin = "{\"KEY3\": \"VALUE3\",\"KEY4\": \"VALUE4\",\"KEY2\": \"VALUE2\",\"KEY1\": \"VALUE1\",\"KEY5\": {\"KEY5_2\": \"VALU5_2\",\"KEY5_1\": \"VALU5_1\"},\"KEY6\": [1, 2, 3]}"
  2. local tjsondata, result, errinfo = json.decode(origin)
  3. if result and type(tjsondata) == "table" then
  4. log.info("testJson.decode KEY1", tjsondata["KEY1"])
  5. log.info("testJson.decode KEY2", tjsondata["KEY2"])
  6. log.info("testJson.decode KEY3", tjsondata["KEY3"])
  7. log.info("testJson.decode KEY4", tjsondata["KEY4"])
  8. log.info("testJson.decode KEY5", tjsondata["KEY5"]["KEY5_1"], tjsondata["KEY5"]["KEY5_2"])
  9. log.info("testJson.decode KEY6", tjsondata["KEY6"][1], tjsondata["KEY6"][2], tjsondata["KEY6"][3])
  10. else
  11. log.info("testJson.decode error", errinfo)
  12. end

3.3、编写JSON生成程序

  1. local torigin =
  2. {
  3. KEY1 = "VALUE1",
  4. KEY2 = "VALUE2",
  5. KEY3 = "VALUE3",
  6. KEY4 = "VALUE4",
  7. KEY5 = {KEY5_1 = "VALU5_1", KEY5_2 = "VALU5_2"},
  8. KEY6 = {1, 2, 3},
  9. }
  10. local jsondata = json.encode(torigin)
  11. log.info("testJson.encode", jsondata)

四、下载完整程序到开发板验证

  完整代码在此,自取

  1. --必须在这个位置定义PROJECT和VERSION变量
  2. --PROJECT:ascii string类型,可以随便定义,只要不使用,就行
  3. --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
  4. PROJECT = "LED"
  5. VERSION = "0.0.1"
  6. require "sys"
  7. --加载日志功能模块,并且设置日志输出等级
  8. --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
  9. require "log"
  10. LOG_LEVEL = log.LOGLEVEL_TRACE
  11. local function Test_Task()
  12. while true do
  13. log.info("Test_Task_run", jsondata)
  14. sys.wait(2000)
  15. end
  16. end
  17. local function user_main()
  18. sys.wait(10000)
  19. sys.taskInit(Test_Task)
  20. local origin = "{\"KEY3\": \"VALUE3\",\"KEY4\": \"VALUE4\",\"KEY2\": \"VALUE2\",\"KEY1\": \"VALUE1\",\"KEY5\": {\"KEY5_2\": \"VALU5_2\",\"KEY5_1\": \"VALU5_1\"},\"KEY6\": [1, 2, 3]}"
  21. local tjsondata, result, errinfo = json.decode(origin)
  22. if result and type(tjsondata) == "table" then
  23. log.info("testJson.decode KEY1", tjsondata["KEY1"])
  24. log.info("testJson.decode KEY2", tjsondata["KEY2"])
  25. log.info("testJson.decode KEY3", tjsondata["KEY3"])
  26. log.info("testJson.decode KEY4", tjsondata["KEY4"])
  27. log.info("testJson.decode KEY5", tjsondata["KEY5"]["KEY5_1"], tjsondata["KEY5"]["KEY5_2"])
  28. log.info("testJson.decode KEY6", tjsondata["KEY6"][1], tjsondata["KEY6"][2], tjsondata["KEY6"][3])
  29. else
  30. log.info("testJson.decode error", errinfo)
  31. end
  32. local torigin =
  33. {
  34. KEY1 = "VALUE1",
  35. KEY2 = "VALUE2",
  36. KEY3 = "VALUE3",
  37. KEY4 = "VALUE4",
  38. KEY5 = {KEY5_1 = "VALU5_1", KEY5_2 = "VALU5_2"},
  39. KEY6 = {1, 2, 3},
  40. }
  41. local jsondata = json.encode(torigin)
  42. log.info("testJson.encode", jsondata)
  43. end
  44. --启动系统框架
  45. sys.taskInit(user_main)
  46. sys.init(0, 0)
  47. sys.run()

  下载完成后打开监视功能,JSON解析成功同时JSON生成也成功没有发送报错

  1. [2020-04-03 11:17:35.561] [2020-04-03 11:17:35.567] [I]-[testJson.decode KEY1] VALUE1
  2. [2020-04-03 11:17:35.571] [I]-[testJson.decode KEY2] VALUE2
  3. [2020-04-03 11:17:35.584] [I]-[testJson.decode KEY3] VALUE3
  4. [2020-04-03 11:17:35.594] [I]-[testJson.decode KEY4] VALUE4
  5. [2020-04-03 11:17:35.599] [I]-[testJson.decode KEY5] VALU5_1 VALU5_2
  6. [2020-04-03 11:17:35.609] [I]-[testJson.decode KEY6] 1 2 3
  7. [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
  8. [2020-04-03 11:17:35.619] ","KEY5_1":"VALU5_1"}}

不会下载的点击这里,进去查看我的第二篇博文2、Air720SL模块Luat开发:第一个Luat的Hello World里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多