如何使用ArduinoJson合并两个JSON文档?
ArduinoJson合并两个JSON文档的正确方法
核心问题
你尝试用add()、set()方法合并JSON对象,但这些方法是针对JSON数组的操作,而你的传感器返回的是JSON对象,所以无法实现键值对的合并与覆盖。ArduinoJson提供了专门的mergeInto()函数来处理对象合并,重复键会以后者的值为准。
示例代码的正确合并方式
针对你给出的测试代码,使用mergeInto()可以实现预期的合并效果:
#include <ArduinoJson.h> void setup() { Serial.begin(115200); DynamicJsonDocument doc1(1024); DynamicJsonDocument doc2(1024); DynamicJsonDocument mergedDoc(1024); // 填充测试数据 doc1["test"]["a"]["b"] = "1"; doc1["test"]["a"]["c"] = "2"; doc2["test"]["a"]["d"] = "3"; doc2["test"]["a"]["c"] = "4"; // 先将doc1合并到目标文档 mergeInto(mergedDoc, doc1); // 再合并doc2,重复键会被doc2的值覆盖 mergeInto(mergedDoc, doc2); // 打印结果验证 serializeJsonPretty(mergedDoc, Serial); } void loop() {}
运行后输出的JSON会符合你的预期:
{ "test": { "a": { "b": "1", "c": "4", "d": "3" } } }
实际传感器场景的解决方案
针对你整合DHT11和Dallas传感器数据的需求,需要分别提取两个传感器返回的JSON对象中的temp和humidity字段,合并到目标文档的对应位置:
假设DHT11.getValuesJson()和DallasSensors.getValuesJson()返回的是DynamicJsonDocument或JsonObject,可以这样处理:
#include <ArduinoJson.h> void setup() { Serial.begin(115200); DynamicJsonDocument doc(2048); DynamicJsonDocument dhtJson = DHT11.getValuesJson(); DynamicJsonDocument dallasJson = DallasSensors.getValuesJson(); // 合并温度数据:先合并Dallas的temp,再合并DHT的temp,重复键覆盖 mergeInto(doc["data"]["temp"], dallasJson["temp"]); mergeInto(doc["data"]["temp"], dhtJson["temp"]); // 合并湿度数据:DHT的湿度数据 mergeInto(doc["data"]["humidity"], dhtJson["humidity"]); // 打印最终结果 serializeJsonPretty(doc, Serial); } void loop() {}
关键说明
mergeInto(target, source)会把source对象的所有键值对复制到target对象中,如果target已有相同键,会被source的值覆盖。- 确保目标文档的内存足够(比如
DynamicJsonDocument的大小参数要足够容纳所有传感器数据),避免内存溢出导致合并失败。 - 如果传感器返回的是
JsonObject而非JsonDocument,直接传入mergeInto即可,无需额外转换。
常见误区
- 不要用
add()处理对象合并:add()是向数组中添加元素,会把整个传感器JSON作为数组元素插入,而不是合并键值对。 - 不要直接赋值
doc["test"]["temp"] = sensorJson:这会直接覆盖doc["test"]["temp"]的原有内容,而不是合并。
内容的提问来源于stack exchange,提问作者Damago
相关产品推荐
相关产品推荐

