加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 1 安装ArduinoJson库
    • 2 ArduinoJson库的使用
    • 3 应用实例
    • 结束语
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

Arduino应用开发——JSON的构建与解析

03/07 12:40
6680
阅读需 16 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

JSON 全称“JavaScript Object Notation”,译为“JavaScript对象简谱”或“JavaScript对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。JSON 在Web开发领域有着举足轻重的地位,如果您想在Web开发领域大展身手的话,就必须了解JSON。

尽管JSON的名称中包含“JavaScript”,但它并不是只能在JavaScript中使用,大多数编程语言都支持JSON(有些本身就支持,有些可以通过第三方库得到支持),例如 JavaScript、Java、PHP、Python、C、C++ 等。

在嵌入式领域,当我们的设备需要跟服务器进行数据交互时往往也会使用JSON格式。因此,本文着重介绍Arduino环境下如果构建和解析JSON格式数据。

1 安装ArduinoJson库

要想在Arduino平台构建和解析JSON格式数据需要借助第三方库。本文主要讲解如何使用ArduinoJson库来实现JSON构建和解析。
ArduinoJson(全称:ArduinoJson-C++ JSON Library for IoT)是嵌入式系统中优雅和高效的Json库。它仅使用最基本的API,确保工作时消耗最小的内存空间。虽然它的命名中包含“Arduino”,但事实上并没有引用Arduino的任何库文件,因此ArduinoJson可以应用在任何的C++项目中。

打开Arduino IDE,点击 工具 -> 管理库,在搜索框输入ArduinoJson,下载安装即可。
注:不同版本的ArduinoJson库API的使用是有区别的,主要分成V5和V6两个版本,本文测试时使用的是当前最新的6.19.4版本。建议用新不用旧,因为更新肯定是往好的方向去优化的。

2 ArduinoJson库的使用

2.1 Json的构建

构建示例:

StaticJsonDocument<200> jsonBuffer;   //声明一个JsonDocument对象,长度200

// 添加对象节点
jsonBuffer["key1"] = 123;          // 整数
jsonBuffer["key2"] = 123.123;      // 浮点数
jsonBuffer["key3"] = "string";     // 字符串

// 添加数组对象
JsonArray array1 = jsonBuffer.createNestedArray("array");// 添加一个 "array" 数组
array1.add(1);    // 往数组里面添加值
array1.add(1.2);  // 往数组里面添加值
array1.add(-10);  // 往数组里面添加值

// 对象嵌套
JsonObject root = jsonBuffer.createNestedObject("key4"); //添加一个对象节点
root["key1"] = "hello";

String output;
serializeJson(jsonBuffer, output);  // 序列化JSON数据并导出字符串

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

构建输出结果:

{"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; //声明一个JsonDocument对象,长度200

// 声明一个JSON数据,用作测试
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"];              // 读取整形数据
double latitude = jsonBuffer["data2"][0];      // 读取数组
double longitude = jsonBuffer["data2"][1];     // 读取数组
int key1 = jsonBuffer["object"]["key1"];       // 读取嵌套对象

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

解析输出结果:

welcome
1351824120
48.756080
2.302038
-254

3 应用实例

示例代码:

#include <ArduinoJson.h>
void setup()
{
    // 初始化串口
    Serial.begin(115200);
}
void loop() {
    /* 构建JSON */
    StaticJsonDocument<200> jsonBuffer;   //声明一个JsonDocument对象,长度200
    // 添加对象节点
    jsonBuffer["key1"] = 123;          // 整数
    jsonBuffer["key2"] = 123.123;      // 浮点数
    jsonBuffer["key3"] = "string";     // 字符串
    // 添加数组对象
    JsonArray array1 = jsonBuffer.createNestedArray("array");// 添加一个 "array" 数组
    array1.add(1);    // 往数组里面添加值
    array1.add(1.2);  // 往数组里面添加值
    array1.add(-10);  // 往数组里面添加值
    // 对象嵌套
    JsonObject root = jsonBuffer.createNestedObject("key4"); //添加一个对象节点
    root["key1"] = "hello";
    // 输出结果:打印构建好的JSON数据
    String output;
    serializeJson(jsonBuffer, output);  // 序列化JSON数据并导出字符串
    Serial.println(output);             // 串口打印最后输出的字符串

    /* 构建JSON的另外一种方法 */
    DynamicJsonDocument doc(200);       // 声明对象的另外一种方法,和上面的 StaticJsonDocument<200> jsonBuffer 一样
    char string[100] = {"{"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}"};  // 声明一个JSON数据
    deserializeJson(doc, string);       
    JsonObject obj = doc.as<JsonObject>(); 
    obj["sensor"] = "fan";          // 修改原来的值 
    obj["add"] = 123;               // 添加新对象 
    // 输出结果:打印构建好的JSON数据
    String output2;
    serializeJson(doc, output2);    // 序列化JSON数据并导出字符串
    Serial.println(output2);        // 串口打印最后输出的字符串
    delay(1000);

    /* 解析JSON */
    StaticJsonDocument<200> jsonBuffer2; //声明一个JsonDocument对象,长度200
    // 声明一个JSON数据,用作测试
    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"];              // 读取整形数据
    double latitude = jsonBuffer2["data2"][0];      // 读取数组
    double longitude = jsonBuffer2["data2"][1];     // 读取数组
    int key1 = jsonBuffer2["object"]["key1"];       // 读取嵌套对象
    // 输出结果:打印解析后的值
    Serial.println(str);      
    Serial.println(data1);
    Serial.println(latitude, 6);
    Serial.println(longitude, 6);
    Serial.println(key1);
    delay(1000);
}

输出结果:

{"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

结束语

好了,关于如何在Arduino上使用JSON的讲解就到这里。本文只是简单的介绍了最常用的几个操作,更多的用法可以在官网上查阅。

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

想了解更多Arduino的内容,可以关注一下博主,后续我还会继续分享更多的经验给大家。

esp8266基于Arduino的开发教程汇总:https://blog.csdn.net/ShenZhen_zixian/article/details/121659482

还有什么问题的话,欢迎在评论区留言。如果这篇文章能够帮到你,就…你懂得。

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
HMC587LC4B 1 Analog Devices Inc Wideband VCO SMT w/Buffer Amplifier, 5 - 10 GHz
$202.42 查看
PBRC16.00HR50X000 1 KYOCERA Corporation Ceramic Resonator, 16MHz Nom, ROHS COMPLIANT, SMALL, CERAMIC, SMD, 3 PIN
$1.2 查看
XUL516100.000000I 1 Integrated Device Technology Inc LVDS Output Clock Oscillator
$49.37 查看

相关推荐

电子产业图谱