2016-08-14 21 views
1

我需要將以下JSON解析爲PackageEntity對象列表。如何使用json.net反序列化一個複雜的分離(「列」/「數據」)JSON到C#對象

由於這個json被分成列和數據,所以我很難以智能的方式這樣做。

的JSON的樣子:

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

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

我想將其反序列化到下面的類的列表:

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

我做了什麼至今:

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

您有沒有問題,理想情況下與您嘗試的代碼相關? – Plutonix

+0

所以這將很簡單:首先你有一個json數組,然後你將有一個json數組數組......你的問題是什麼? –

+0

感謝您的回答, basiclly我需要將其轉換爲c#對象(列表) 我不明白如何解析這個,因爲它被分爲列名稱和數據在單獨的json對象。 我通常與其他結構如{「Object」:「Value」}一起使用json – user2320176

回答

1

您可以使用t他以下通用custom JsonConverter反序列化數據:

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

然後按如下方式使用它:

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

注意使用Enumerable.Zip()配成對的條目列陣列中的條目的每一行中數據數組進入臨時的JObject進行反序列化。

+0

謝謝你的工作很棒! – user2320176

相關問題