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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 15:45:01