2016-08-14 3 views
1

次のJSONをPackageEntityオブジェクトのリストに解析する必要があります。json.netを使用して複雑な( "Column"/"Data")jsonをc#オブジェクトにデシリアライズする方法

このjsonはColumnとDataに分かれているので、私は賢明なやり方で問題を抱えています。 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

その後

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()の使用は、各列のエントリを持つ列配列内のエントリをペアリングする彼はあなたのデータをデシリアライズするために、一般的なcustom JsonConverterを次データ配列をデシリアライズのために一時的にJObjectに変換します。

+0

ありがとうございました! – user2320176

関連する問題