书接上篇, 我们获取了JSON数据怎么解析, 如果将来我们想发送JSON字符串怎么操作?
原来我们可以使用arduinoJson库完成这些工作
以我们上一篇收到的JSON为例
{
"results": [
{
"location": {
"id": "WW7MBNP039PE",
"name": "泰安",
"country": "CN",
"path": "泰安,泰安,山东,中国",
"timezone": "Asia/Shanghai",
"timezone_offset": "+08:00"
},
"now": { "text": "晴", "code": "0", "temperature": "28" },
"last_update": "2020-09-09T10:09:00+08:00"
}
]
}
我们该如何解析这个JSON呢?其实解析过程很简单, 而且只用了强大的ArduinoJson库的一小部分功能
具体操作请参考本文第八节
下面是 ArduinoJSON库的核心内容:
一.V6版本函数库结构
可以看出,方法主要分为四大类:
JsonDocument相关,这是整个json库的入口,它负责高效管理内存以及调用json解析器;
JsonObject相关;
JsonArray相关;
解析、构造相关;
在此先介绍一个概念: JsonVariant —— json变体(存储可以放在json文件中的任意类型数据,包括int,float,数组,对象,可以认为它是一个抽象的对象概念,或者一个由JSON限定的var 或者dynamic ,理解即可)
二. 最重要的JsonDocument
JsonDocument作为整个V6版本ArduinoJson库的内存入口,负责处理整个json数据的内存管理,这是我们需要首先重点关注的内容。
1.两个实现类:
(1). DynamicJsonDocument
DynamicJsonDocument,内存分配在heap区,无固定大小,可以自动增长所需空间,方法调用完自动回收,建议内存大小大于1KB使用;
DynamicJsonDocument doc(2048); //创建一个DynamicJsonDocument类型的doc对象,大小2048byte
(2). StaticJsonDocument
StaticJsonDocument,内存分配在stack区,有固定大小,大小值由开发者定义,方法调用完自动回收,建议内存大小小于1KB使用;
StaticJsonDocument<256> doc;
2. 使用JsonDocument
创建一个JsonDocument之后,默认初始化为空,调用 JsonDocument::isNull()会返回true,这个时候既可以代表当做jsonObject,也可以当做jsonArray,这取决于你插入第一个value的类型。
例1: doc 作为JsonObject使用
DynamicJsonDocument doc(1024);
doc["answer"] = 42;
// the doc contains {"answer":42}
例2: doc 作为JsonArray使用
DynamicJsonDocument doc(1024);
doc.add(42);
// the doc contains [42]
3. as —— 获取顶节点,并把它转成T类型
DynamicJsonBuffer doc(1024);
deserializeJson(doc, "{\"key\":\"value\