2017-12-18 12 views
-1

私はC#でJSONをデシリアライズするために使用し、次の拡張メソッドを持っています。デシリアライズJSON - ネストされたパラメータを持つ問題

public static T DeserializeJson<T>(string response) 
     where T : class 
    { 
     var s = new DataContractJsonSerializer(typeof(T)); 

     try 
     { 
      using (var ms = new MemoryStream()) 
      { 
       byte[] data = System.Text.Encoding.UTF8.GetBytes(response); 
       ms.Write(data, 0, data.Length); 
       ms.Position = 0; 

       return (T)s.ReadObject(ms); 
      } 
     } 
     catch 
     { 
      return default(T); 
     } 
    } 

これは正しく動作します。

データコントラクトは、次のようになります。

[DataContract] 
    public class ResponseProps 
    { 
     [DataMember(Name = "status", Order = 0)] 
     public string ResponseCode { get; set; } 

     [DataMember(Name = "lead_id", Order=1)] 
     public string LeadId { get; set; } 

     [DataMember(Name = "price", Order=2)] 
     public decimal Price { get; set; } 

     [DataMember(Name = "redirect_url", Order = 3)] 
     public string RedirectUrl { get; set; } 

     [DataMember(Name = "errors", Order = 4)] 
     public string Errors { get; set; } 
    } 

は、しかし、特定の状況で、私はエラーを取得し、直列化復元は失敗します。

この問題は、私が明らかに正しく処理していないいくつかの応答でデータが返送されたために発生しているようです。ここで問題を引き起こしているように見えるのデータがあります:

{"status":4,"errors":[{"Duplicate Application":"Duplicate Application"}]} 

誰もが、私はこの問題を解決する方法として、アイデアを得ましたか。

+1

なぜ、オハイオ州なぜ、人は「私はエラーを取得する」を書き込む代わりに、実際のエラーメッセージを貼り付けておくのですか?あなたが5年間SOのメンバーになってきたので、あなたはそれ以上に知っているはずです!ああ、あなたの[mcve]は最小でも完全でも検証可能でもありません。それを修正してください。 (そうでなければ良い質問です!) – Heinzi

+2

あなたのメッセージのリスト/配列にエラーがあるようですが、そのプロパティをpublicリストに設定しようとするとエラーが発生します。セット; } ' – TiGreX

+0

@TiGreXリストや配列はどちらも直接置換として動作しないようです –

答えて

1

ResponseProps.Errorsの種類はList<Dictionary<string, string>>、ない文字列でなければなりません。

+0

これは機能しますそれ。 –

+0

なぜ重要なのはDictionary だけではないのですか? –

+0

@JohnOhara '[' ']'はそれが配列かリストであることを示します。 http://json.orgを参照してください。 'Errors'の値は' [{"重複アプリケーション": "重複アプリケーション"}、{"重複アプリケーション": "重複アプリケーション"}] 'であると考えてください。 – skyoxZ

関連する問題