2017-08-25 4 views
0

Ich habe ein paar JSON von meinen Philips Hue-Lampen. Es sieht aus wie das.Deserialisieren von JSON in .net mit inkrementellen Ganzzahlen

{ 
    "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", 
    } 
} 

Wie Sie jede Lampe eine Nummer 1 hat sehen können, 2, 3 usw. für jede Lampe dem System hinzugefügt.

Wie erstelle ich ein Modell zur Deserialisierung dieser Daten? Was ich versuchte, funktioniert nicht.

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); 
} 

Und mein Objekt, das ich meist importiert. Wenn ich es direkt versuchen, den Import es spaltet es sich wie 1_ 2_ 3_ usw.

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; } 
} 
+1

Wenn Sie debug, was bedeutet 'Modell 'aussehen, nachdem Sie Ihre' JsonConvert.DeserializeObject' tun? Du wirst nicht das bekommen, wonach du suchst, wenn du '.Count()' auf einer Zeichenkette aufruft ... – ragerory

+1

Du kannst besser mit 'Dictionary ' als 'RootObject' arbeiten. Sie sollten die IDs zu Ganzzahlen zerlegen lassen, und Sie werden dann die IDs als Ihre Schlüssel mit ihren Glühbirnen als den entsprechenden Wert haben. – Gavin

Antwort

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

Ich bekomme diesen Fehler jetzt. Das aktuelle JSON-Objekt (z. B. {"name": "Wert"}) kann nicht in Typ 'HueWeb.Controllers.State []' deserialisiert werden, da der Typ ein JSON-Array (z. B. [1,2,3]) erfordert, um korrekt zu deserialisieren. Um diesen Fehler zu beheben, ändern Sie den JSON entweder in ein JSON-Array (zB [1,2,3]) oder ändern Sie den deserialisierten Typ so, dass es ein normaler .NET-Typ ist (zB kein primitiver Typ wie Integer, kein Collection-Typ) wie ein Array oder Liste ), die von einem JSON-Objekt deserialisiert werden kann. JsonObjectAttribute kann auch zum Typ hinzugefügt werden, um die Deserialisierung von einem JSON-Objekt zu erzwingen. – Zucchini

+1

@Zucchini * state * ist kein Array von * State *. erkläre es als "öffentlichen Staat" {bekommen; einstellen; } 'in * BulbNumber * –

+0

Wie würde ich dann ein Wörterbuch nach meiner Ansicht weitergeben? – Zucchini

Verwandte Themen