AndroidJSON parsing nested GET-Response

  arduinojson, c++, esp8266, nodemcu, philips-hue

I’am trying to iterate over a nested JSON-Object which i get as a HTTP-GET Response from my Hue-Bridge. The Response is something like this:

{
    "name": "ViKo",
    "type": "GroupScene",
    "group": "2",
    "lights": [
        "1",
        "2",
        "6",
        "9",
        "11",
        "17",
        "18"
    ],
    "recycle": false,
    "locked": false,
    "picture": "",
    "version": 2,
    "lightstates": {
        "1": {
            "on": false,
            "bri": 254,
            "ct": 230
        },
        "2": {
            "on": false,
            "bri": 254,
            "ct": 230
        },
        "6": {
            "on": true,
            "bri": 254,
            "ct": 230
        },
        "9": {
            "on": false,
            "bri": 254,
            "ct": 230
        },
        "11": {
            "on": true,
            "bri": 254,
            "ct": 230
        },
        "17": {
            "on": true,
            "bri": 254,
            "ct": 230
        },
        "18": {
            "on": true,
            "bri": 254,
            "ct": 230
        }
    }
}

Now i am interested in the member lightstates and the containing sub objects and iterating over the subitems with a loop (or something like thsi).

My Arduino (NodeMCU)-Code looks something like this:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>

void loop()
{

  if (digitalRead(BUTTON) == HIGH)
  {

    //Check WiFi connection status
    if (WiFi.status() == WL_CONNECTED)
    {
      HTTPClient http;
      WiFiClient client;

      http.begin(client, BRIDGE_SCENE_URL + SCENE_VIKO);

      int httpCode = http.GET();
      String payload = http.getString();

      if (httpCode == 200)
      {
        const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 60;

        DynamicJsonDocument doc(capacity);
        deserializeJson(doc, payload);
        JsonObject root = doc.as<JsonObject>();

        JsonObject name = root.getMember("lightstates").as<JsonObject>();

        for (JsonPair kv : name)
        {
          Serial.println(kv.key().c_str());
        }

      }

      http.end(); //Close connection

      delay(500);
    }

  }

}

So i am getting a valid json response from the Bridge but the for-loop does not print anything.
The goal ist to iterate over lightstates and put the values in a method with signature similar to

void changeLightState(int id, boolean on, int bri, int ct)

It would be great if anyone has an idea for me.

Source: Windows Questions C++

LEAVE A COMMENT