2017-03-10 5 views
-1

Ich habe Schwierigkeiten, das JSON-Snippet unten zu deserialzer wegen der verschiedenen zurückgegebenen Felder, zum Beispiel in der Konfiguration, funktioniert es ok mit config.on, wie dies in jedem Config-Block ist, aber wie sie alle sind anders, wie komme ich da rum? Der JSON gibt alle verschiedenen angeschlossenen Sensoren mit unterschiedlichen Feldern zurück.Deserialize JSON

dynamic obj = JsonConvert.DeserializeObject(response); 
// 
foreach (var item in obj) 
{ 
    string temperature = item.ToString();   //this shows the full object in text 
    // Debug.WriteLine(temperature);   //this shows the full object in text 

    dynamic group = item; 

    string idstring = group.Name.ToString(); 

    foreach (var prop in group) 
    { 
     string name = prop.name; 
     string temp = prop.config.on; 
     //string temp = prop.state.lastupdated; 
     //string temp = prop.swversion; 

     //Debug.WriteLine(temp); 

     string namestring = name.ToString(); 
     string tempstring = temp.ToString(); 

     arr[0] = idstring.ToLower(); 
     arr[1] = namestring.ToLower(); 
     arr[2] = tempstring.ToLower(); 

mit einem Teil der JSON-Antwort

{ 
    "1": { 
     "state": { 
      "daylight": true, 
      "lastupdated": "2017-03-10T07:01:00" 
     }, 
     "config": { 
      "on": true, 
      "configured": true, 
      "sunriseoffset": 30, 
      "sunsetoffset": -30 
     }, 
     "name": "Daylight", 
     "type": "Daylight", 
     "modelid": "PHDL00", 
     "manufacturername": "Philips", 
     "swversion": "1.0" 
    }, 
    "2": { 
     "state": { 
      "temperature": 1830, 
      "lastupdated": "2017-03-10T08:11:51" 
     }, 
     "config": { 
      "on": true, 
      "battery": 100, 
      "reachable": true, 
      "alert": "none", 
      "ledindication": false, 
      "usertest": false, 
      "pending": [ 

}, 
"name": "Hall", 
"type": "ZLLPresence", 
"modelid": "SML001", 
"manufacturername": "Philips", 
"swversion": "6.1.0.18912", 
"uniqueid": "00:17:88:01:02:01:8b:be-02-0406" 
    }, 
"4": { 
    "state": { 
    "lightlevel": 12270, 
    "dark": true, 
    "daylight": false, 
    "lastupdated": "2017-03-10T08:14:28" 
}, 
"config": { 
    "on": true, 
    "battery": 100, 
    "reachable": true, 
    "alert": "none", 
    "tholddark": 16011, 
    "tholdoffset": 7000, 
    "ledindication": false, 
    "usertest": false, 
    "pending": [ 

    ] 
}, 
"name": "Hue ambient light sensor 1", 
"type": "ZLLLightLevel", 
"modelid": "SML001", 
"manufacturername": "Philips", 
"swversion": "6.1.0.18912", 
"uniqueid": "00:17:88:01:02:01:8b:be-02-0400" 
    }, 
    "5": { 
"state": { 
    "temperature": 1919, 
    "lastupdated": "2017-03-10T08:12:50" 
+6

Das ist nicht C - meinen Sie diese C# markieren? – UnholySheep

+0

Ja, um C zu sein # – Andy

Antwort

0

Es gibt keine Notwendigkeit, mit der Umwandlung von fehlenden Eigenschaften zu String mehrfach besonders kreativ zu sein. Anstatt also, dies zu tun:

string namestring = name.ToString(); 
string tempstring = temp.ToString(); 

Sie einfach für null Zustand überprüfen vorne (wenn Sie benötigen) nehmen und entsprechend handeln. Json.NET wird keine Ausnahme aus, wenn eine Eigenschaft fehlt, so können Sie versuchen, alle Felder, die Sie benötigen und dann entsprechend der Geschäftslogik ausführen:

string name = prop.name; 
string temp = prop.config.on; 
string battery = prop.config.battery; 
if (battery == null) 
    // maybe throw exception, maybe assign default value; whatever fits you 
+0

Ich bin neu und lerne C#, wie würde ich dem Nullwert einen Standardwert zuweisen? – Andy

+0

'if (Batterie == null) Batterie =" myDefaultValue ";' – bc004346

+1

Danke, funktioniert perfekt, alle Felder sind richtig ausgefüllt – Andy