ArduinoJSON:过滤数据
ArduinoJSON 库,顾名思义,可以帮助您在 Arduino 上处理 JSON 对象。要安装它,请前往库管理器并搜索 ArduinoJSON。安装由 Benoit Blanchon 编写的库。

这是一个文档非常丰富的库。事实上,它有自己的网站 − https://arduinojson.org/。您可以在此网站上找到几个问题的答案。
在本文中,我们将研究如何从较大的 JSON 中过滤数据并生成较小的 JSON。
下载 ArduinoJSON 库后,请转到:文件→示例→ArduinoJSON
示例
我们应该查看的示例是 JsonFilterExample。代码如下 −
#include <ArduinoJson.h>
void setup() {
// 初始化串口
Serial.begin(9600);
while (!Serial) continue;
// 大量输入:OpenWeatherMap 响应摘录
const __FlashStringHelper* input_json = F("{\"cod\":\"200\",\"message\":0,\"list [{\"dt\":1581498000,\"main\":{"
"\"temp\":3.23,\"feels_like\":- 3.63,\"temp_min\":3.23,\"temp_max\":4.62,"
"\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1010,\"humidity\":" "58,\"temp_kf\":-
1.39},\"weather\":[{\"id\":800,\"main\":\"Clear\","
"\"description\":\"clear "
"sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":0},\"wind\":{\"speed\":6." "19,\"deg\":266},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-12 "
"09:00:00\"},{\"dt\":1581508800,\"main\":{\"temp\":6.09,\"feels_like\":-
"
"1.07,\"temp_min\":6.09,\"temp_max\":7.13,\"pressure\":1015,\"sea_"
"level\":1015,\"grnd_level\":1011,\"humidity\":48,\"temp_kf\":- 1.04},
"\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear "
"sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":9},\"wind\":{\"speed\":6."
"64,\"deg\":268},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-12 "
"12:00:00\"}],\"city\":{\"id\":2643743,\"name\":\"London\",\"coord\":{"
"\"lat\":51.5085,\"lon\":- 0.1257},\"country\":\"GB\",\"population\":"
"1000000,\"timezone\":0,\"sunrise\":1581492085,\"sunset\":1581527294}}");
// 过滤器:对于我们想要保留的每个值,它都包含 "true"
StaticJsonDocument<200> filter;
filter[&"list&"][0][&"dt&"] = true;
filter[&"list&"][0][&"main&"][&"temp&"] = true;
// 反序列化文档
StaticJsonDocument<400> doc;
deserializeJson(doc, input_json, DeserializationOption::Filter(filter));
// 打印结果
serializeJsonPretty(doc, Serial);
}
void loop() {
// 本例中未使用
}
如您所见,在 sketch 的开头,一个非常大的 JSON 被加载到 flash 中。这是一个非常大的 JSON。如果您以 pretty 格式进行可视化,它看起来如下 −
{
"cod":"200",
"message":0,
"list":[
{
"dt":1581498000,
"main":{
"temp":3.23,
"feels_like":-3.63,
"temp_min":3.23,
"temp_max":4.62,
"pressure":1014,
"sea_level":1014,
"grnd_level":1010,
"humidity":58,
"temp_kf":-1.39
},
"weather":[
{
"id":800,
"main":"Clear",
"description":"clear sky",
"icon":"01d"
}
],
"clouds":{
"all":0
},
"wind":{
"speed":6.19,
"deg":266
},
"sys":{
"pod":"d"
},
"dt_txt":"2020-02-12 09:00:00"
},
{
"dt":1581508800,
"main":{
"temp":6.09,
"feels_like":-1.07,
"temp_min":6.09,
"temp_max":7.13,
"pressure":1015,
"sea_level":1015,
"grnd_level":1011,
"humidity":48,
"temp_kf":-1.04
},
"weather":[
{
"id":800,
"main":"Clear",
"description":"clear sky",
"icon":"01d"
}
],
"clouds":{
"all":9
},
"wind":{
"speed":6.64,
"deg":268
},
"sys":{
"pod":"d"
},
"dt_txt":"2020-02-12 12:00:00"
}
],
"city":{
"id":2643743,
"name":"London",
"coord":{
"lat":51.5085,
"lon":-0.1257
},
"country":"GB",
"population":1000000,
"timezone":0,
"sunrise":1581492085,
"sunset":1581527294
}
}
现在,我们不想在 JSON 文档中保留所有这些数据。因此,我们定义了一个包含所需键的过滤器。如您所见,我们希望保留 'list' 数组中的 'dt' 键,以及 'list' 数组的 'main' 键中的嵌套 'temp' 键。因此,我们创建一个新的 JSON 文档过滤器,其中包含这些键。
StaticJsonDocument<200> filter; filter["list"][0]["dt"] = true; filter["list"][0]["main"]["temp"] = true;
过滤器 JSON 格式如下 −
{
"list": [
{"dt":true}
{ "main": {
{"temp": true}
}
]
}
在 deserializeJson 函数中,我们添加了第三个参数,用于实现此过滤器。
deserializeJson(doc, input_json, DeserializationOption::Filter(filter));
输出
现在,当我们在串口监视器上打印此 JSON 文档时,输出为 −

如您所见,输出中只包含您指定的键。因此,通过过滤,一个非常大的 JSON 数据被缩减成了一个较小的 JSON 数据。这样可以节省空间,并降低复杂性。
再举一个例子,如果您想保留"message"键以及"country"和"population"键,则您的过滤器 JSON 将如下所示:−
StaticJsonDocument<200> filter; filter["message"] = true; filter["city"]["country"] = true; filter["city"]["population"] = true;
串行监视器的输出将如下所示 −


