Search code examples
c#.netjsonphilips-hue

Deserializing JSON in .net with incremental integer


I have an some JSON from my Philips hue bulbs. It looks like this.

{
  "1": {
    "state": {
      "on": false,
      "bri": 75,
      "hue": 60309,
      "sat": 192,
      "effect": "none",
      "xy": [
        0.5002,
        0.2691
      ],
      "ct": 443,
      "alert": "select",
      "colormode": "xy",
      "reachable": false
    },
    "swupdate": {
      "state": "noupdates",
      "lastinstall": null
    },
    "type": "Extended color light",
  },
  "2": {
    "state": {
      "on": true,
      "bri": 254,
      "hue": 38000,
      "sat": 254,
      "effect": "none",
      "xy": [
        0.1603,
        0.3238
      ],
      "ct": 153,
      "alert": "select",
      "colormode": "hs",
      "reachable": true
    },
    "swupdate": {
      "state": "noupdates",
      "lastinstall": null
    },
    "type": "Extended color light",
  },
  "3": {
    "state": {
      "on": true,
      "bri": 254,
      "hue": 38000,
      "sat": 254,
      "effect": "none",
      "xy": [
        0.1603,
        0.3238
      ],
      "ct": 153,
      "alert": "none",
      "colormode": "hs",
      "reachable": true
    },
    "swupdate": {
      "state": "noupdates",
      "lastinstall": null
    },
    "type": "Extended color light",
  }
}

As you can see each bulb has a number 1, 2 ,3 etc for each bulb added to the system.

How do i create a model to deserialize this data? What i tried doesn't work.

using (var getclient = new HttpClient())
{
    Rootobject model = new Rootobject();

    string bulburl = "http://<ip>/api/<token>/lights";
    Console.WriteLine($"URL: {bulburl}");

    var json = await getclient.GetStringAsync(bulburl);
    Console.WriteLine("Json count: " + json.ToString().Count());

    model = JsonConvert.DeserializeObject<Rootobject>(json);
    Console.WriteLine("model count: " + model.ToString().Count());

    return View(model);
}

And my object which i mostly imported. When i try importing it directly it splits it up as 1_ 2_ 3_ etc.

public class Rootobject
{
    public BulbNumber[] bulbnumber { get; set; }
}

public class BulbNumber
{
    public State[] state { get; set; }
    public Swupdate swupdate { get; set; }
    public string type { get; set; }
    public string name { get; set; }
    public string modelid { get; set; }
    public string manufacturername { get; set; }
    public string uniqueid { get; set; }
    public string swversion { get; set; }
    public string swconfigid { get; set; }
    public string productid { get; set; }
}

public class State
{
    public bool on { get; set; }
    public int bri { get; set; }
    public int hue { get; set; }
    public int sat { get; set; }
    public string effect { get; set; }
    public float[] xy { get; set; }
    public int ct { get; set; }
    public string alert { get; set; }
    public string colormode { get; set; }
    public bool reachable { get; set; }
}

public class Swupdate
{
    public string state { get; set; }
    public object lastinstall { get; set; }
}

Solution

  • var dict = JsonConvert.DeserializeObject<Dictionary<string, BulbNumber>>(json);