ArduinoJSON:序列化和反序列化


顧名思義,ArduinoJSON 庫可以幫助你在 Arduino 上處理 JSON 物件。要安裝它,請轉到庫管理器,搜尋 ArduinoJSON。安裝 Benoit Blanchon 編寫的庫。

這是文件非常完善的庫之一。事實上,它有自己的網站:https://arduinojson.org/。你可以在這個網站上找到許多問題的答案。

在本文中,我們將學習如何使用這個庫進行序列化(生成 JSON 文件)和反序列化(解析 JSON 文件)。

序列化

讓我們從序列化開始。它非常簡單。如果你使用過 Python,這段程式碼看起來會更加熟悉。

下載 ArduinoJSON 庫後,轉到 - 檔案→示例→ArduinoJSON

對於序列化,我們應該檢視的示例是 JsonGeneratorExample。你會注意到程式碼中有大量註釋,建議你仔細閱讀這些註釋。

沒有註釋的程式碼如下所示:

#include <ArduinoJson.h>

void setup() {
   Serial.begin(9600);
   while (!Serial) continue;
   StaticJsonDocument<200> doc;
   doc["sensor"] = "gps";
   doc["time"] = 1351824120;

   JsonArray data = doc.createNestedArray("data");
   data.add(48.756080);
   data.add(2.302038);

   serializeJson(doc, Serial);
   Serial.println();

   serializeJsonPretty(doc, Serial);
}
   void loop() {
}

輸出

這段程式碼或多或少是自解釋的。序列埠監視器的輸出如下所示:

需要注意幾點:

  • 向 JSON 新增鍵值對的語法是:doc_name[key] = valueJsonArray 型別用於將陣列作為任何鍵的值新增。上面的程式碼很好地解釋了這一點(對於鍵“data”)。

  • serializeJSON 接受兩個引數:JSON 文件和目標緩衝區。因此,你可以使用以下程式碼,而不是直接列印到序列埠:

serializeJson(doc, serializedJSON);
Serial.println(serializedJSON);

輸出結果將相同。

反序列化

反序列化是序列化的逆過程。你有一個 JSON 文件(它可以來自任何來源,例如序列埠、Web 伺服器等),並且你希望解析它。轉到 - 檔案 → 示例 → ArduinoJSON 並開啟 JsonParserExample。同樣,這是一個註釋豐富的程式碼,建議你閱讀示例中的註釋。

示例

沒有註釋的程式碼如下:

#include <ArduinoJson.h>

void setup() {
   Serial.begin(9600);
   while (!Serial) continue;
   StaticJsonDocument<200> doc;

   char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";

   DeserializationError error = deserializeJson(doc, json);

   if (error) {
      Serial.print(F("deserializeJson() failed: "));
      Serial.println(error.f_str());
      return;
   }

   const char* sensor = doc["sensor"];
   long time = doc["time"];
   double latitude = doc["data"][0];
   double longitude = doc["data"][1];

   Serial.println(sensor);
   Serial.println(time);
   Serial.println(latitude, 6);
   Serial.println(longitude, 6);
}

void loop() {
}

輸出

序列埠監視器的輸出為:

如你所見,反序列化的語法是 deserializeJson(doc, json),如果發生任何錯誤,它會返回錯誤。它接受兩個引數:用於儲存反序列化輸出的 JSON 文件和包含 JSON 內容的緩衝區。

獲得反序列化內容後,提取內容的語法如下:

data_type var_name = doc[key]

建議你閱讀其他 ArduinoJSON 示例。

更新於:2021年7月26日

6000+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.