2018-11-7 14:09:05 [显示全部楼层]
7709浏览
查看: 7709|回复: 3

[ESP32系列教程] ESP32 MicroPython教程:解析JSON

[复制链接]
  本micropython教程旨在阐释如何使用在ESP32上运行的MicroPython解析JSON字符串。

简介

本文旨在阐释如何使用在ESP32上运行的MicroPython解析JSON字符串。如果你想了解在ESP32上设置MicroPython的方法,请参阅这篇此前的帖子:
以获取详细指南。该指南还解释了如何连接Python提示符。

为解析JSON字符串,我们将用到MicroPython uJSON库(https://docs.micropython.org/en/latest/pyboard/library/ujson.html)。你还可以在Github上(https://github.com/micropython/micropython/blob/master/docs/library/ujson.rst)查看该库的文档。

我们将运用命令行测试代码,因此我们需要借助一个工具把JSON内容压缩成一行,这样我们就可以轻松地完成粘贴。我们将通过这个网站(https://www.cleancss.com/json-minify/)接收JSON字符串并将其压缩到一行。然后,复制JSON并在终端窗口右击,将其传递给Putty。


代码

连接到Python提示符后,就可以开始编码了。我们首先要做的是导入uJSON模块。只需键入下方表达式并按回车键即可。
  1. import ujson
复制代码
之后,我们就可以访问ujson对象了,这将使loads方法生效。此方法以JSON字符串作为输入值进行接收,然后返回与已解析的JSON[1]对应的对象。我们将从一个简单的JSON结构开始,该结构如下所示。
  1.   {
  2.   "name":"John"
  3.    },
复制代码
把它压缩成一行后,我们得到如下所示的JSON字符串。


  1.   {"name":"John"},
复制代码
我们现在将此字符串作为前文提到的loads方法的输入值进行传递。请注意,为了从JSON结构转义引号,我们在字符串两边添加"""符号将其括起来。对象将被存储于名为parsed(已解析)的变量中。


  1. parsed = ujson.loads("""{"name":"John"}""")
复制代码
现在,我们来验证返回对象已正确获取JSON内容。我们将其打印出来。此外,我们要使用type函数打印对象的类型。


  1.    print (parsed)
  2.    print (type(parsed))
复制代码
在运行完上文全部代码后,我们应该会得到一个类似于图1的结果。请注意,包含已解析内容的对象的类型是Python字典(https://www.tutorialspoint.com/python/python_dictionary.htm),因此以键值的形式获取内容非常适用。


TueJuly-202107209973..png
图1 - 解析JSON字符串。


现在,我们将获取“name”键的值。它应返回“John”。要获取字典中该键的值,请发送以下命令。请注意,此过程和获取数组值相似,但此处用的不是索引,而是字符串格式的键。

  1.    print(parsed["name"])
复制代码
你应该会得到类似于图2的结果。请注意,控制台上会打印姓名“John”。

TueJuly-202107201290..png
图2 - 访问字典对象的已解析值。

为了完成示例,我们现在将解析更复杂的结构,如下所示。例如,显示从物联网设备发送的消息。


  1.    {
  2.     "device":"temperature",
  3.     "id":543,
  4.     "values":[1,2,3]
  5.      }
复制代码
压缩后,我们得到以下结果:

  1.   {"device":"temperature","id":543,"values":[1,2,3]}
复制代码
我们现在将对其进行解析并打印JSON结构中的所有键。我们还将打印“values”结构的类型,以了解解析程序映射它的方式。


  1.     parsed = ujson.loads("""{"device":"temperature","id":543,"values":[1,2,3]}""")
  2.     print (parsed["device"])
  3.     print (parsed["id"])
  4.     print (parsed["values"])
  5.     print(type(parsed["values"]))
复制代码
你应该会得到类似于图3的结果。可以看出,每个键的所有值都已正确打印。在“values”键的实例中,字典内的结构是一个列表,而不是值的字符串表示形式。这自然更为有利,因为我们可以使用列表可用的所有函数对这些值进行操作,从而降低操作难度。

TueJuly-202107206263..png
图3 – JSON内容解析后的结果。

注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。

查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程 汇总贴

椅子凳  初级技师

发表于 2018-11-12 15:37:33

哇好棒啊
回复

使用道具 举报

长得就像嵌入式  学徒

发表于 2019-11-17 21:50:43

这就是人民大众的福音,小白在这给大神们献上一拜
回复

使用道具 举报

沧海笑  高级技师

发表于 2021-3-29 10:38:49

长得就像嵌入式 发表于 2019-11-17 21:50
这就是人民大众的福音,小白在这给大神们献上一拜

和大家讨论一下,如何将接收自uart的byte,转换为str后,作为解析json的数据来源。
ujson.loads("""{"device":"temperature","id":543,"values":[1,2,3]}""")
转义这部分,是否有师兄详解一下,谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail