ArduinoJSON:数据过滤
顾名思义,ArduinoJSON 库有助于你在 Arduino 上处理 JSON 对象。要安装它,请转到库管理器并搜索 ArduinoJSON。安装 Benoit Blanchon 开发的库。
这是文档非常齐全的库之一。事实上,它有自己的网站 - https://arduinojson.org/。你可以在该网站上找到许多问题的答案。
在本文中,我们将了解如何从较大的 JSON 中过滤数据并生成较小的 JSON。
下载 ArduinoJSON 库后,转到:文件→示例→ArduinoJSON
示例
我们应该查看的示例是 JsonFilterExample。代码如下:
#include <ArduinoJson.h> void setup() { // Initialize serial port Serial.begin(9600); while (!Serial) continue; // The huge input: an extract from OpenWeatherMap response 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}}"); // The filter: it contains "true" for each value we want to keep StaticJsonDocument<200> filter; filter["list"][0]["dt"] = true; filter["list"][0]["main"]["temp"] = true; // Deserialize the document StaticJsonDocument<400> doc; deserializeJson(doc, input_json, DeserializationOption::Filter(filter)); // Print the result serializeJsonPretty(doc, Serial); } void loop() { // not used in this example }
如你所见,在草图的开头,一个非常大的 JSON 加载到闪存中。这是一个非常大的 JSON。如果你以漂亮的格式可视化它,它看起来是这样的:
{ "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”键以及来自“city”键的“country”和“population”键,你的过滤器 JSON 将如下所示:
StaticJsonDocument<200> filter; filter["message"] = true; filter["city"]["country"] = true; filter["city"]["population"] = true;
串口监视器输出将如下所示:
广告