keer_zu 发表于 2025-5-20 13:00

arduino esp32的json库

在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官方文档。
页: [1]
查看完整版本: arduino esp32的json库