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
相关产品推荐
相关产品推荐

