2016-03-29 12 views
2

Ein vorhandener JSON-basierter Web-Service gibt ein ziemlich unordentliches JSON-Objekt zurück, in dem alle nützlichen Daten in den Elementen eines Arrays enthalten sind, das selbst der Inhalt eines Elementarray. So etwas wie dies (ich bin Anonymisierung es hoffentlich keine Tippfehler):Deserialisieren eines inneren Arrays zu Objekten mithilfe von JSON.net

{"rows":[[ 
    {"name":"John","time":"2016-03-20 01:00:00","id":"2","code":"1234"}, 
    {"name":"Sam","time":"2016-03-20 01:00:00","id":"24","code":"999"}, 
    {"name":"Paul","time":"2016-03-20 01:00:00","id":"12","code":"6512"} 
]]} 

Mit JSON.net Ich brauche jede dieser Reihe Unterelemente zugreifen, aber ich bin nicht sicher, wie über diese zu durchlaufen, und wenn Ich sollte auf einen konkreten Typ deserialisieren oder einfach die Rohdaten von meinem Json-Objekt lesen.

Die Daten werden innerhalb einer Methode aggregiert, so dass der 'Typ' jedes row nicht etwas ist, das außerhalb der Methode bekannt sein muss.

rows wird immer ein 1-Element-Array sein, das ein Array von Elementen wie gezeigt enthält.

Antwort

2

@ Fals-Lösung sollte gut funktionieren, aber wenn Sie sich mit dem RootObject tun möchten, können Sie Verwenden Sie Json.Net's LINQ-to-JSON API, um den JSON zu analysieren und die Daten in eine einfache Liste von Elementen zu bekommen, mit der einfach zu arbeiten ist.

Angenommen, Sie eine Klasse für die Positionsdaten wie folgt definiert:

public class Item 
{ 
    public string name { get; set; } 
    public DateTime time { get; set; } 
    public string id { get; set; } 
    public string code { get; set; } 
} 

Dann können Sie dies tun, um Ihre Liste der Elemente zu erhalten:

List<Item> items = JObject.Parse(json)["rows"][0] 
          .Select(jt => jt.ToObject<Item>()) 
          .ToList(); 

Fiddle: https://dotnetfiddle.net/FtB3Cu


Wenn Sie keine Klassen deklarieren möchten und stattdessen einen anonymen Typ verwenden

var items = JObject.Parse(json)["rows"][0] 
        .Select(jt => new 
        { 
         name = (string)jt["name"], 
         time = (DateTime)jt["time"], 
         id = (string)jt["id"], 
         code = (string)jt["code"] 
        }) 
        .ToList(); 

Fiddle: e, können Sie den Code, um diese Änderung https://dotnetfiddle.net/0QXUzZ

+0

Danke Brian . Gibt es eine Möglichkeit, dies weiter mit einem anonymen methoden-lokalen Typ zu kombinieren, um zu vermeiden, dass ein konkreter Typ deklariert wird?Oder hat man einfach eine private innere Klasse? –

+0

@ Mr.Boy Ja, Sie können anonyme Typen verwenden. Ich habe meine Antwort bearbeitet, um zu zeigen, wie. Es sollte auch mit einer inneren Klasse funktionieren, wenn Sie diese Route wählen. –

+0

Brilliant, vielen Dank –

1

Es ist einfach, Ihr Root-Objekt enthält ein List<List<>>:

public class InnerObject 
{ 
    public string name { get; set; } 
    public DateTime time { get; set; } 
    public string id { get; set; } 
    public string code { get; set; } 
} 

public class RootObject 
{ 
    public List<List<InnerObject>> rows { get; set; } 
} 

Dann nutzen JSON.NET:

string json = @"{'rows':[[ 
        {'name':'John','time':'2016-03-20 01:00:00','id':'2','code':'1234'}, 
        {'name':'Sam','time':'2016-03-20 01:00:00','id':'24','code':'999'}, 
        {'name':'Paul','time':'2016-03-20 01:00:00','id':'12','code':'6512'} 
       ]]}"; 

var rootObject = JsonConvert.DeserializeObject<RootObject>(json); 

By the way, diese Seite

Ihr Objekt aussehen soll json2csharp kann die C# -Klasse von JSON generieren, erleichtert das Leben :)

EDIT:

Sie können auch dynamische verwenden, und dann vermeiden Sie den Parser aus der `RootObject:

var rootObject = JsonConvert.DeserializeObject<dynamic>(json); 
rootObject.rows[0] <--- should have what you need 
+0

Dank. Gibt es eine gute Möglichkeit, "RootObject" zu vermeiden, ohne die Zeichenfolge manuell hacken zu müssen? Erhalten Sie einfach ein Array/List von InnerObject von einem JSON.net-Aufruf zurück? –

+0

@ Mr.Boy Sie können einen benutzerdefinierten JsonCreationConverter erstellen, http://www.newtonsoft.com/json/help/html/DeserializeCustomCreationConverter.htm – Fals

+0

@ Mr.Boy siehe die Bearbeitung oben, macht denkt dynamischer :) – Fals

Verwandte Themen