2015-09-16 117 views
1

我在UniversalApp上工作,它調用大量返回JSON數據的webservices。反序列化包含對象列表的Json

所有web服務返回的Json我的第一級(WsResponse.cs),包含此結構:

public string status { get; set; } 
public object data { get; set; } 
public List<object> errors { get; set; } 

如果狀態爲「成功」,我可以反序列化的簡單數據目的是通過:

WsResponse wsResponse = JsonConvert.DeserializeObject<WsResponse>(response);  
User user = JsonConvert.DeserializeObject<User>(wsResponse.data.ToString()); 

在其他情況下,有必要首先反序列化在一個結果對象,之前反序列化DATAS:

WsResponse wsResponse = JsonConvert.DeserializeObject<WsResponse>(response); 
WsResponseResult wsResponseResult = JsonConvert.DeserializeObject<WsResponseResult>(
                  wsResponse.data.ToString()); 
List<Theme> themes = JsonConvert.DeserializeObject<List<Theme>>(
                wsResponseResult.result.ToString()); 

但是,如果狀態是「失敗」,我需要捕獲錯誤列表。但我不能反序列化這個對象列表... 這裏是JSON金銀幣,我從web服務獲得的一個例子,當它包含錯誤:

{ 
    "status": "failure", 
    "data": {}, 
    "errors": [ 
    { 
     "200": "The parameter 'email' is not present" 
    }, 
    { 
     "200": "The parameter 'password' is not present" 
    } 
    ] 
} 

我嘗試反序列化它:

List<KeyValuePair<string, string>> kvpError = new List<KeyValuePair<string,string>>(); 
kvpError = JsonConvert.DeserializeObject<List<KeyValuePair<<string, string>>>(
                  wsResponse.errors.ToString()); 

Dictionary<string, string> dError = new Dictionary<string, string>(); 
dError = JsonConvert.DeserializeObject<Dictionary<string, string>>(
                  wsResponse.errors.ToString()); 

=>,但它不工作

我還通過錯誤DATAS嘗試反序列化在他們面前:

foreach(var error in wsResponse.errors) 
{       
    KeyValuePair<string, string> kvpError = new KeyValuePair<string,string>(); 
    kvpError = JsonConvert.DeserializeObject<KeyValuePair<string, string>>(
                     error.ToString()); 
} 

=>,但它不工作得更好...

你會對如何解決我的問題的想法?

回答

1

您的JSON的結構方式,errors實際上是一個List<Dictionary<string, string>>。如果您使用的不是List<object>,將反序列化的錯誤正確:

public class Response 
{ 
    public string status { get; set; } 
    public object data { get; set; } 
    public List<Dictionary<string, string>> errors { get; set; } 
} 

產量:

Deserialization result

附註 - 如果你有JSON結構的任何控制,你最好關閉,您可以反序列化一個List<KeyValuePair<string, string>>。另外,不是使用object data,而是在JSON內部實際傳遞User屬性,以便您可以節省雙重反序列化。

如果你想使人們有可能反序列化這一個List<KeyValuePair<string, string>>,你的JSON需要看起來像這樣:

{ 
    "status": "failure", 
    "data": {}, 
    "errors": [ 
    { 
     "Key": "200", "Value": "The parameter 'email' is not present" 
    }, 
    { 
     "Key": "200", "Value": "The parameter 'password' is not present" 
    } 
    ] 
} 
+0

謝謝,它工作正常。 但是JSON的這種結構並不是很好,因爲每個詞典都只包含一個項目... –

+0

@ Gold.strike - 我同意這一點,這就是我在我的答案的buttom pqrt中所說的。考慮如果可能的話重構你的JSON。 –

+0

我會跟我的客戶討論這個問題,看看我們是否可以改變JSON結構。 您使用過哪種工具來查找對象的類型? –