2016-05-23 3 views
2

Ich bin mit JSON.net ein wenig vertraut und kann das JSON mit einfacher Struktur (bis zu einem Kind) deserialisieren. Ich bin gerade dabei, den JSON zu deserialisieren, der von der Netatmo-API zurückgegeben wird. Die Struktur von JSON ist für mich kompliziert. Im Folgenden ist die Grundstruktur des JSON-Deserialisieren von JSON mit Child und Inner Childs

_id 
place 
    location 
     Dynamic Value 1 
     Dynamic Value2 
    altitude 
    timezone 
mark 
measures 
    Dynamic Value 1 
    res 
     Dynamic Value 1 
       Dynamic Value 1 
      Dynamic Value 2 
    type 
     Dynamic Value 1 
     Dynamic Value 2 
modules 
    Dynamic Value 1 

Dynamischer Wert 1 und dynamischen Wert 2 repräsentiert die Werte, die für jede ID geändert wird. Die vollständige JSON ist unten angegeben,

{ 
    "body": [{ 
     "_id": "70:ee:50:02:b4:8c", 
     "place": { 
      "location": [-35.174779762001, -5.8918476117544], 
      "altitude": 52, 
      "timezone": "America\/Fortaleza" 
     }, 
     "mark": 0, 
     "measures": { 
      "02:00:00:02:ba:2c": { 
       "res": { 
        "1464014579": [16.7, 77] 
       }, 
       "type": ["temperature", "humidity"] 
      }, 
      "70:ee:50:02:b4:8c": { 
       "res": { 
        "1464014622": [1018.1] 
       }, 
       "type": ["pressure"] 
      } 
     }, 
     "modules": ["02:00:00:02:ba:2c"] 
    }, { 
     "_id": "70:ee:50:12:40:cc", 
     "place": { 
      "location": [-16.074257294385, 11.135715243973], 
      "altitude": 14, 
      "timezone": "Africa\/Bissau" 
     }, 
     "mark": 14, 
     "measures": { 
      "02:00:00:06:7b:c8": { 
       "res": { 
        "1464015073": [26.6, 78] 
       }, 
       "type": ["temperature", "humidity"] 
      }, 
      "70:ee:50:12:40:cc": { 
       "res": { 
        "1464015117": [997] 
       }, 
       "type": ["pressure"] 
      } 
     }, 
     "modules": ["02:00:00:06:7b:c8"] 
    }], 
    "status": "ok", 
    "time_exec": 0.010364055633545, 
    "time_server": 1464015560 
} 

Ich bin verwirrt, indem ich auf die komplexe Struktur dieses JSON. Für einzelne Ebene von JSON habe ich diesen Code in der Vergangenheit verwendet,

IList<lstJsonAttributes> lstSearchResults = new List<lstJsonAttributes>(); 
foreach (JToken objResult in objResults) { 
    lstJsonAttributes objSearchResult = JsonConvert.DeserializeObject<lstJsonAttributes>(objResult.ToString()); 
    lstSearchResults.Add(objSearchResult); 
} 

Aber für so viel Kind habe ich noch zu verstehen, wie die Objektklasse erstellt werden. Jede Anleitung wird sehr geschätzt.

Update: Das habe ich bisher erreicht.

I wie unten eine Hauptklasse erstellt haben,

public class PublicDataClass 
{ 
    public string _id { get; set; } 
    public PublicData_Place place { get; set; } 
    public string mark { get; set; } 
    public List<string> modules { get; set; } 
} 

und "Platz" Klasse ist wie folgt,

public class PublicData_Place 
{ 
    public List<string> location { get; set; } 
    public string altitude { get; set; } 
    public string timezone { get; set; } 
} 

Dann habe ich das Objekt in der folgenden Codezeile deserialisiert,

var obj = JsonConvert.DeserializeObject<List<PublicDataClass>>(jsonString); 

Ich kann jetzt alle Daten mit Ausnahme der "Maßnahmen", die ein wenig komplizierter ist, erfolgreich erhalten.

Antwort

1

Mithilfe von können JSON-Objekte mit beliebigen Eigenschaftsnamen, aber festen Schemas für ihre Werte als Dictionary<string, T> für einen geeigneten Typ T deserialisiert werden. Details finden Sie unter Deserialize a Dictionary. So können Ihre Objekte "measures" und "res" als Wörterbücher modelliert werden.

Sie benötigen auch ein Root-Objekt, um Ihre List<PublicDataClass> zu kapseln, da Ihr Root-JSON-Container ein Objekt wie folgt ist: { "body": [{ ... }] }.

So können Sie Ihre Klassen wie folgt definieren:

public class RootObject 
{ 
    public List<PublicDataClass> body { get; set; } 
    public string status { get; set; } 
    public double time_exec { get; set; } 
    public int time_server { get; set; } 
} 

public class PublicDataClass 
{ 
    public string _id { get; set; } 
    public PublicData_Place place { get; set; } 
    public int mark { get; set; } 
    public List<string> modules { get; set; } 
    public Dictionary<string, Measure> measures { get; set; } 
} 

public class PublicData_Place 
{ 
    public List<double> location { get; set; } // Changed from string to double 
    public double altitude { get; set; } // Changed from string to double 
    public string timezone { get; set; } 
} 

public class Measure 
{ 
    public Measure() 
    { 
     this.Results = new Dictionary<string, List<double>>(); 
     this.Types = new List<string>(); 
    } 

    [JsonProperty("res")] 
    public Dictionary<string, List<double>> Results { get; set; } 

    [JsonProperty("type")] 
    public List<string> Types { get; set; } 
} 

Dann

var root = JsonConvert.DeserializeObject<RootObject>(jsonString); 
var obj = root.body; 
+0

Bündel Vielen Dank für Ihre Antwort tun und wie Sie haben es erklärt. Ich erreichte langsam an diesem Punkt. Ich habe http://json2csharp.com/ verwendet, um JSON in C# -Objekte umzuwandeln. Es hat das Objekt für die Measures nicht erfolgreich erstellt, aber dann auf einen anderen Post auf SO verwiesen und den gesamten JSON in ein dynamisches Objekt konvertiert. Es hat alles erstellt und alle Daten aufgefüllt. Ich habe gerade die Objekte im QuickWatch-Fenster betrachtet und herausgefunden, dass geschachtelte untergeordnete Objekte für Measures als Dictionary erstellt wurden.Benutzerdefinierter Typ ist viel einfacher mit verschachtelten dynamischen Objekten zu arbeiten. –

+0

Ich habe es gerade getestet und es hat ohne Probleme funktioniert. Noch einmal Danke. –

1

Ich habe mit XML für ein paar Jahre gearbeitet und meine Änderung an der JSON-Struktur habe ich ein wenig verwirrt, immer, dass ich sehen möchte, wie ein Objekt wie ich diese Website jsoneditoronline aussehen Einfach kopieren und einfügen Ihr JSON und klicken Sie auf den Pfeil, um zu einem Objekt zu analysieren, ich hoffe, es hilft, bis Sie sich an die JSON-Struktur gewöhnt haben.

Verwandte Themen