2017-12-18 75 views
-1

我有以下擴展方法,我用它來反序列化json在c#中。反序列化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

錯誤似乎是在您的消息列表/數組,您可以嘗試將屬性設置爲'公開列表錯誤{get;組; }' – TiGreX

+0

@TiGreX既不是列表或數組,也不是直接替換 –

回答

1

ResponseProps.Errors的類型應該是List<Dictionary<string, string>>,不是字符串。

+0

This works - thanks for那。 –

+0

作爲一個感興趣的問題,爲什麼它不只是Dictionary ? –

+0

@JohnOhara''''''表示它是一個數組或列表。見http://json.org。考慮'Errors'的值可能是'[{「重複應用程序」:「重複應用程序」},{「重複應用程序」:「重複應用程序」}]'。 – skyoxZ