• 正文
    • 1 安裝ArduinoJson庫(kù)
    • 2 ArduinoJson庫(kù)的使用
    • 3 應(yīng)用實(shí)例
    • 結(jié)束語(yǔ)
  • 推薦器件
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Arduino應(yīng)用開(kāi)發(fā)——JSON的構(gòu)建與解析

2024/03/07
6115
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

JSON 全稱(chēng)“JavaScript Object Notation”,譯為“JavaScript對(duì)象簡(jiǎn)譜”或“JavaScript對(duì)象表示法”,是一種輕量級(jí)的、基于文本的、開(kāi)放的數(shù)據(jù)交換格式。JSON 在Web開(kāi)發(fā)領(lǐng)域有著舉足輕重的地位,如果您想在Web開(kāi)發(fā)領(lǐng)域大展身手的話(huà),就必須了解JSON。

盡管JSON的名稱(chēng)中包含“JavaScript”,但它并不是只能在JavaScript中使用,大多數(shù)編程語(yǔ)言都支持JSON(有些本身就支持,有些可以通過(guò)第三方庫(kù)得到支持),例如 JavaScript、Java、PHP、Python、C、C++ 等。

嵌入式領(lǐng)域,當(dāng)我們的設(shè)備需要跟服務(wù)器進(jìn)行數(shù)據(jù)交互時(shí)往往也會(huì)使用JSON格式。因此,本文著重介紹Arduino環(huán)境下如果構(gòu)建和解析JSON格式數(shù)據(jù)。

1 安裝ArduinoJson庫(kù)

要想在Arduino平臺(tái)構(gòu)建和解析JSON格式數(shù)據(jù)需要借助第三方庫(kù)。本文主要講解如何使用ArduinoJson庫(kù)來(lái)實(shí)現(xiàn)JSON構(gòu)建和解析。
ArduinoJson(全稱(chēng):ArduinoJson-C++ JSON Library for IoT)是嵌入式系統(tǒng)中優(yōu)雅和高效的Json庫(kù)。它僅使用最基本的API,確保工作時(shí)消耗最小的內(nèi)存空間。雖然它的命名中包含“Arduino”,但事實(shí)上并沒(méi)有引用Arduino的任何庫(kù)文件,因此ArduinoJson可以應(yīng)用在任何的C++項(xiàng)目中。

打開(kāi)Arduino IDE,點(diǎn)擊 工具 -> 管理庫(kù),在搜索框輸入ArduinoJson,下載安裝即可。
注:不同版本的ArduinoJson庫(kù)API的使用是有區(qū)別的,主要分成V5和V6兩個(gè)版本,本文測(cè)試時(shí)使用的是當(dāng)前最新的6.19.4版本。建議用新不用舊,因?yàn)楦驴隙ㄊ峭玫姆较蛉?yōu)化的。

2 ArduinoJson庫(kù)的使用

2.1 Json的構(gòu)建

構(gòu)建示例:

StaticJsonDocument<200> jsonBuffer;   //聲明一個(gè)JsonDocument對(duì)象,長(zhǎng)度200

// 添加對(duì)象節(jié)點(diǎn)
jsonBuffer["key1"] = 123;          // 整數(shù)
jsonBuffer["key2"] = 123.123;      // 浮點(diǎn)數(shù)
jsonBuffer["key3"] = "string";     // 字符串

// 添加數(shù)組對(duì)象
JsonArray array1 = jsonBuffer.createNestedArray("array");// 添加一個(gè) "array" 數(shù)組
array1.add(1);    // 往數(shù)組里面添加值
array1.add(1.2);  // 往數(shù)組里面添加值
array1.add(-10);  // 往數(shù)組里面添加值

// 對(duì)象嵌套
JsonObject root = jsonBuffer.createNestedObject("key4"); //添加一個(gè)對(duì)象節(jié)點(diǎn)
root["key1"] = "hello";

String output;
serializeJson(jsonBuffer, output);  // 序列化JSON數(shù)據(jù)并導(dǎo)出字符串

Serial.println(output);             // 串口打印最后輸出的字符串

構(gòu)建輸出結(jié)果:

{"key1":123,"key2":123.123,"key3":"string","array":[1,1.2,-10],"key4":{"key1":"hello"}}
{
    "key1":123,
    "key2":123.123,
    "key3":"string",
    "array":[1,1.2,-10],
    "key4":{
        "key1":"hello"
    }
}

2.2 Json的解析

解析示例:

StaticJsonDocument<200> jsonBuffer; //聲明一個(gè)JsonDocument對(duì)象,長(zhǎng)度200

// 聲明一個(gè)JSON數(shù)據(jù),用作測(cè)試
char json[] ="{"str":"welcome","data1":1351824120,"data2":[48.756080,2.302038],"object":{"key1":-254}}";

// 反序列化JSON
DeserializationError error = deserializeJson(jsonBuffer, json);
if (error) 
{
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
}

// 解析JSON
const char* str = jsonBuffer["str"];           // 讀取字符串
long data1 = jsonBuffer["data1"];              // 讀取整形數(shù)據(jù)
double latitude = jsonBuffer["data2"][0];      // 讀取數(shù)組
double longitude = jsonBuffer["data2"][1];     // 讀取數(shù)組
int key1 = jsonBuffer["object"]["key1"];       // 讀取嵌套對(duì)象

// 輸出結(jié)果:打印解析后的值
Serial.println(str);      
Serial.println(data1);
Serial.println(latitude, 6);
Serial.println(longitude, 6);
Serial.println(key1);

解析輸出結(jié)果:

welcome
1351824120
48.756080
2.302038
-254

3 應(yīng)用實(shí)例

示例代碼:

#include <ArduinoJson.h>
void setup()
{
    // 初始化串口
    Serial.begin(115200);
}
void loop() {
    /* 構(gòu)建JSON */
    StaticJsonDocument<200> jsonBuffer;   //聲明一個(gè)JsonDocument對(duì)象,長(zhǎng)度200
    // 添加對(duì)象節(jié)點(diǎn)
    jsonBuffer["key1"] = 123;          // 整數(shù)
    jsonBuffer["key2"] = 123.123;      // 浮點(diǎn)數(shù)
    jsonBuffer["key3"] = "string";     // 字符串
    // 添加數(shù)組對(duì)象
    JsonArray array1 = jsonBuffer.createNestedArray("array");// 添加一個(gè) "array" 數(shù)組
    array1.add(1);    // 往數(shù)組里面添加值
    array1.add(1.2);  // 往數(shù)組里面添加值
    array1.add(-10);  // 往數(shù)組里面添加值
    // 對(duì)象嵌套
    JsonObject root = jsonBuffer.createNestedObject("key4"); //添加一個(gè)對(duì)象節(jié)點(diǎn)
    root["key1"] = "hello";
    // 輸出結(jié)果:打印構(gòu)建好的JSON數(shù)據(jù)
    String output;
    serializeJson(jsonBuffer, output);  // 序列化JSON數(shù)據(jù)并導(dǎo)出字符串
    Serial.println(output);             // 串口打印最后輸出的字符串

    /* 構(gòu)建JSON的另外一種方法 */
    DynamicJsonDocument doc(200);       // 聲明對(duì)象的另外一種方法,和上面的 StaticJsonDocument<200> jsonBuffer 一樣
    char string[100] = {"{"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}"};  // 聲明一個(gè)JSON數(shù)據(jù)
    deserializeJson(doc, string);       
    JsonObject obj = doc.as<JsonObject>(); 
    obj["sensor"] = "fan";          // 修改原來(lái)的值 
    obj["add"] = 123;               // 添加新對(duì)象 
    // 輸出結(jié)果:打印構(gòu)建好的JSON數(shù)據(jù)
    String output2;
    serializeJson(doc, output2);    // 序列化JSON數(shù)據(jù)并導(dǎo)出字符串
    Serial.println(output2);        // 串口打印最后輸出的字符串
    delay(1000);

    /* 解析JSON */
    StaticJsonDocument<200> jsonBuffer2; //聲明一個(gè)JsonDocument對(duì)象,長(zhǎng)度200
    // 聲明一個(gè)JSON數(shù)據(jù),用作測(cè)試
    char json[] ="{"str":"welcome","data1":1351824120,"data2":[48.756080,2.302038],"object":{"key1":-254}}";
    // 反序列化JSON
    DeserializationError error = deserializeJson(jsonBuffer2, json);
    if (error) 
    {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
        return;
    }
    // 解析JSON
    const char* str = jsonBuffer2["str"];           // 讀取字符串
    long data1 = jsonBuffer2["data1"];              // 讀取整形數(shù)據(jù)
    double latitude = jsonBuffer2["data2"][0];      // 讀取數(shù)組
    double longitude = jsonBuffer2["data2"][1];     // 讀取數(shù)組
    int key1 = jsonBuffer2["object"]["key1"];       // 讀取嵌套對(duì)象
    // 輸出結(jié)果:打印解析后的值
    Serial.println(str);      
    Serial.println(data1);
    Serial.println(latitude, 6);
    Serial.println(longitude, 6);
    Serial.println(key1);
    delay(1000);
}

輸出結(jié)果:

{"key1":123,"key2":123.123,"key3":"string","array":[1,1.2,-10],"key4":{"key1":"hello"}}
{"sensor":"fan","time":1351824120,"data":[48.75608,2.302038],"add":123}

welcome
1351824120
48.756080
2.302038
-254

結(jié)束語(yǔ)

好了,關(guān)于如何在Arduino上使用JSON的講解就到這里。本文只是簡(jiǎn)單的介紹了最常用的幾個(gè)操作,更多的用法可以在官網(wǎng)上查閱。

ArduinoJson API介紹:
https://arduinojson.org/v5/api/
https://arduinojson.org/v6/api/

想了解更多Arduino的內(nèi)容,可以關(guān)注一下博主,后續(xù)我還會(huì)繼續(xù)分享更多的經(jīng)驗(yàn)給大家。

esp8266基于Arduino的開(kāi)發(fā)教程匯總:https://blog.csdn.net/ShenZhen_zixian/article/details/121659482

還有什么問(wèn)題的話(huà),歡迎在評(píng)論區(qū)留言。如果這篇文章能夠幫到你,就…你懂得。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠(chǎng)商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
DS2431P-A1+T 1 Maxim Integrated Products EEPROM, 1KX1, Serial, CMOS, PDSO6, ROHS COMPLIANT, TSOC-6
$3.23 查看
ST3215SB32768B0HSZA1 1 Kyocera AVX Components Quartz Crystal,

ECAD模型

下載ECAD模型
暫無(wú)數(shù)據(jù) 查看
SFH250V 1 OSRAM GmbH PIN-TYPE PHOTODIODE,LSR-3
$13.14 查看

相關(guān)推薦