You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32开发:ArduinoJson自定义转换器的添加与集成咨询

ESP32 ArduinoJson 自定义类序列化/反序列化实现

1. 定义自定义类

先创建一个示例类,比如传感器数据类:

class SensorData {
public:
  float temperature;
  float humidity;
  unsigned long timestamp;

  // 可选构造函数,方便初始化
  SensorData(float temp = 0.0, float hum = 0.0, unsigned long ts = 0)
    : temperature(temp), humidity(hum), timestamp(ts) {}
};

2. 实现自定义转换器函数

这两个函数必须定义在全局命名空间中(确保ArduinoJson能自动识别),不需要作为类的成员函数:

序列化函数(convertToJson)

负责将自定义类对象转换为JsonVariant:

void convertToJson(const SensorData& data, JsonVariant variant) {
  variant["temp"] = data.temperature;
  variant["hum"] = data.humidity;
  variant["ts"] = data.timestamp;
}

反序列化函数(convertFromJson)

负责从JsonVariant解析数据到自定义类对象:

bool convertFromJson(JsonVariant variant, SensorData& data) {
  // 检查必要字段是否存在,避免解析失败
  if (!variant.containsKey("temp") || !variant.containsKey("hum") || !variant.containsKey("ts")) {
    return false;
  }

  data.temperature = variant["temp"].as<float>();
  data.humidity = variant["hum"].as<float>();
  data.timestamp = variant["ts"].as<unsigned long>();
  return true;
}

3. 实际使用示例

现在就能按照你期望的方式直接赋值调用:

序列化(将类对象存入JsonDocument)

#include <ArduinoJson.h>

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

  // 初始化自定义类对象
  SensorData mySensor(25.5, 60.2, millis());

  // 创建JsonDocument,根据数据大小调整容量
  StaticJsonDocument<256> doc;

  // 直接赋值完成序列化
  doc["mydata"] = mySensor;

  // 输出JSON字符串
  serializeJson(doc, Serial);
}

void loop() {}

反序列化(从JsonDocument读取到类对象)

#include <ArduinoJson.h>

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

  // 模拟外部获取的JSON数据
  const char* rawJson = "{\"mydata\":{\"temp\":23.1,\"hum\":55.8,\"ts\":123456}}";

  StaticJsonDocument<256> doc;
  deserializeJson(doc, rawJson);

  SensorData mySensor;
  // 直接赋值完成反序列化
  mySensor = doc["mydata"];

  // 打印解析结果
  Serial.print("Temperature: ");
  Serial.println(mySensor.temperature);
  Serial.print("Humidity: ");
  Serial.println(mySensor.humidity);
  Serial.print("Timestamp: ");
  Serial.println(mySensor.timestamp);
}

void loop() {}

关键注意事项

  • 转换器函数必须全局可见,不能放在函数内部,否则ArduinoJson无法自动触发调用。
  • 反序列化时建议添加字段检查,避免因JSON格式错误导致程序异常。
  • 根据自定义类的字段数量和数据大小,调整JsonDocument的容量参数,防止内存溢出。

内容的提问来源于stack exchange,提问作者Perthboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:43:14