2016-08-14 3 views
1

Ich muss den folgenden JSON in eine List of PackageEntity Object analysieren.Wie ein komplexes getrenntes ("Column"/"Data") JSON zu C# -Objekt unter Verwendung von json.net deserialisieren.

Da dieser JSON in Spalte und Daten unterteilt ist, habe ich Schwierigkeiten, dies auf intelligente Weise zu tun.

Die JSON wie folgt aussieht:

{ 
    "COLUMNS": ["NSHIPMENTID", "NSHIPPINGCOMPANYID", "NUSERID", "NWEIGHT", "NHEIGHT"], 

    "DATA": [ 
     [7474, null, 12363, "16", "2"], 
     [7593, null, 12363, "64", "7"] 
    ] 
} 

würde ich es auf eine Liste der folgenden Klasse deserialisiert mag:

public class PackageEntity 
{ 
    public int NSHIPMENTID { get; set; } 
    public string NSHIPPINGCOMPANYID { get; set; } 
    public int NUSERID { get; set; } 
    public decimal NWEIGHT { get; set; } 
    public decimal NHEIGHT { get; set; } 
} 

, was ich bisher tat:

JObject JsonDe = JObject.Parse(responseString); 
       int length = JsonDe.Property("DATA").Value.ToArray().Count(); 

       List<PackageEntity> _list = new List<PackageEntity>(); 

       for (int i = 0; i < length; i++) 
       { 
        PackageEntity pD = new PackageEntity(); 
        pD.NSHIPMENTID = JsonDe.Property("DATA").Value.ToArray()[i][0].ToString(); 
        pD.NSHIPPINGCOMPANYID = JsonDe.Property("DATA").Value.ToArray()[i][1].ToString(); 
        pD.NUSERID = JsonDe.Property("DATA").Value.ToArray()[i][2].ToString(); 
        pD.NWEIGHT = JsonDe.Property("DATA").Value.ToArray()[i][3].ToString(); 
        pD.NHEIGHT = JsonDe.Property("DATA").Value.ToArray()[i][4].ToString(); 
        _list.Add(pD); 
       } 
+0

Hatten Sie eine Frage, die im Idealfall mit dem Code Ihrer Versuche zusammenhängt? – Plutonix

+0

so wäre dies einfach: zuerst haben Sie ein JSON-Array und dann werden Sie eine Reihe von JSON-Arrays haben ... Was ist Ihre Frage? –

+0

Vielen Dank für Ihre Antworten, basicllly ich muss es in ein C# -Objekt konvertieren (Liste ) Ich verstehe nicht, wie Sie dies analysieren, da es in Spaltennamen und Daten in separaten Json-Objekt unterteilt ist. Ich arbeitete normalerweise mit JSON mit anderer Struktur wie {"Objekt": "Wert"} – user2320176

Antwort

1

Sie können t verwenden er folgende allgemeine custom JsonConverter Ihre Daten deserialisieren:

public class ColumnarDataToListConverter<T> : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(List<T>); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 
     var list = existingValue as List<T> ?? new List<T>(); 
     var obj = JObject.Load(reader); 
     var columns = obj["COLUMNS"] as JArray; 
     var data = obj["DATA"] as JArray; 
     if (data == null) 
      return list; 
     list.AddRange(data 
      .Select(item => new JObject(columns.Zip(item, (c, v) => new JProperty((string)c, v)))) 
      .Select(o => o.ToObject<T>(serializer))); 
     return list; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

es dann wie folgt verwenden:

var settings = new JsonSerializerSettings { Converters = new[] { new ColumnarDataToListConverter<PackageEntity>() } }; 
var list = JsonConvert.DeserializeObject<List<PackageEntity>>(responseString, settings); 

Beachten Sie die Verwendung von Enumerable.Zip(), um die Einträge in der Spalte Array paaren mit den Einträgen in jeder Reihe das Datenarray in eine temporäre JObject für Deserialisierung.

+0

Vielen Dank, es funktioniert großartig! – user2320176

Verwandte Themen