打印

arduino esp32的json库

[复制链接]
467|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2025-5-20 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在Arduino ESP32开发中,处理JSON数据常用的库是 ArduinoJson,它是一个高效、轻量且易用的库,适用于解析和生成JSON格式的数据。以下是关于在ESP32项目中使用JSON库的详细指南:


1. 推荐库:ArduinoJson

  • GitHub地址: ArduinoJson
  • 特点:
    • 支持JSON解析(反序列化)和生成(序列化)。
    • 内存占用低,适合嵌入式设备。
    • 兼容Arduino IDE和PlatformIO。
    • 支持动态和静态内存分配。

2. 安装方法

通过Arduino IDE库管理器安装:

  1. 打开Arduino IDE。
  2. 菜单栏选择 工具 > 管理库
  3. 搜索 ArduinoJson,选择最新版本安装。

3. 基本用法示例

解析JSON数据(反序列化)

#include <ArduinoJson.h>

const char* json = "{\"temperature\":25.5,\"humidity\":60}";

void setup() {
  Serial.begin(115200);

  // 创建JsonDocument对象(动态内存分配)
  DynamicJsonDocument doc(1024);
  DeserializationError error = deserializeJson(doc, json);

  if (error) {
    Serial.print("JSON解析失败: ");
    Serial.println(error.c_str());
    return;
  }

  // 提取数据
  float temperature = doc["temperature"];
  int humidity = doc["humidity"];

  Serial.print("温度: ");
  Serial.println(temperature);
  Serial.print("湿度: ");
  Serial.println(humidity);
}

void loop() {}

生成JSON数据(序列化)

#include <ArduinoJson.h>

void setup() {
  Serial.begin(115200);

  // 创建JsonDocument对象
  DynamicJsonDocument doc(1024);
  doc["sensor"] = "DHT22";
  doc["value"] = 42;
  doc["active"] = true;

  // 序列化为字符串
  String output;
  serializeJson(doc, output);
  Serial.println(output);
}

void loop() {}

4. 注意事项

内存管理

  • ESP32的堆内存较大(约320KB),但需合理分配 DynamicJsonDocument的大小。

  • 如果启用了ESP32的PSRAM(外部RAM),可在代码中配置ArduinoJson使用PSRAM:

    #include <ArduinoJson.h>
    struct SpiRamAllocator {
      void* allocate(size_t size) { return heap_caps_malloc(size, MALLOC_CAP_SPIRAM); }
      void deallocate(void* ptr) { heap_caps_free(ptr); }
    };
    using SpiRamJsonDocument = BasicJsonDocument<SpiRamAllocator>;

版本兼容性

  • ArduinoJson v6.x 是当前主流版本,语法与旧版v5.x不同,建议使用v6.x。

5. 其他JSON库

如果项目对内存要求极高,可考虑以下轻量级库:

  • JSON-Variant: 适用于简单键值对。
  • SimpleJSON: 代码量少,适合基础解析。

6. 常见问题

Q1: 解析时返回 InvalidInput错误

  • 检查JSON格式是否正确(如引号、逗号)。
  • 使用在线工具(如 JSONLint)验证JSON。

Q2: 内存不足导致崩溃

  • 增大 DynamicJsonDocument的大小。
  • 减少嵌套层级或简化JSON结构。

7. 进阶应用

  • 与HTTP客户端结合(如WiFiClient或HTTPClient):

    #include <WiFi.h>
    #include <HTTPClient.h>
    #include <ArduinoJson.h>
    
    void fetchData() {
      HTTPClient http;
      http.begin("http://api.example.com/data");
      int httpCode = http.GET();
    
      if (httpCode == HTTP_CODE_OK) {
        String payload = http.getString();
        DynamicJsonDocument doc(2048);
        deserializeJson(doc, payload);
        // 处理数据...
      }
      http.end();
    }
  • 嵌套JSON处理

    // 示例JSON: {"sensors":[{"name":"temp","value":25}, {"name":"hum","value":60}]}
    JsonArray sensors = doc["sensors"];
    for (JsonObject sensor : sensors) {
      const char* name = sensor["name"];
      int value = sensor["value"];
    }

通过上述方法,你可以在ESP32项目中高效处理JSON数据。如果需要更复杂的操作,请参考 ArduinoJson官方文档。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1445

主题

12781

帖子

53

粉丝