Arduino(NodeMCU)解析Hue桥GET响应嵌套JSON并遍历lightstates字段
问题原因
你当前的问题出在JSON解析缓冲区容量不足,你定义的capacity仅60多字节,完全无法容纳你给出的完整JSON结构,导致deserializeJson时字段被截断,lightstates对象解析为空,遍历自然没有输出。
修正步骤
- 调大
DynamicJsonDocument的容量,针对你给出的JSON结构,分配1024字节足够覆盖所有内容,还能预留冗余避免后续结构变动出问题 - 增加解析合法性校验,避免空对象访问导致设备崩溃
- 遍历
lightstates键值对时,提取对应参数调用changeLightState方法
修正后代码片段
仅需替换你原有代码中if (httpCode == 200)的代码块即可:
if (httpCode == 200) { // 调大缓冲区容量 const size_t capacity = 1024; DynamicJsonDocument doc(capacity); DeserializationError err = deserializeJson(doc, payload); // 先判断解析是否成功 if (err) { Serial.print("JSON解析失败: "); Serial.println(err.c_str()); http.end(); return; } JsonObject root = doc.as<JsonObject>(); // 判断lightstates字段是否存在且为对象 if (!root.containsKey("lightstates") || !root["lightstates"].is<JsonObject>()) { Serial.println("lightstates字段不存在或格式错误"); http.end(); return; } JsonObject lightStates = root["lightstates"].as<JsonObject>(); for (JsonPair kv : lightStates) { // 提取灯ID:字符串转int int lightId = atoi(kv.key().c_str()); JsonObject state = kv.value().as<JsonObject>(); // 提取三个参数 bool on = state["on"]; int bri = state["bri"]; int ct = state["ct"]; // 调用你的方法 changeLightState(lightId, on, bri, ct); // 调试输出可按需保留 Serial.printf("灯%d: 开关%d 亮度%d 色温%d\n", lightId, on, bri, ct); } }
注意事项
如果后续你接入的灯数量变多、JSON结构变大,可以再适当调高capacity的数值,避免容量不足导致解析截断即可。
内容的提问来源于stack exchange,提问作者der-jung
相关产品推荐
相关产品推荐

