我在UniversalApp上工作,调用很多返回JSON数据的web服务。
所有的webservices都返回了第一级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());
在其他情况下,在对数据进行反序列化之前,必须先在结果对象中反序列化:
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数据的示例,当它包含错误时我从webservice获取:
{
"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());
=&GT;但它不起作用
在反序列化之前,我还尝试通过错误数据:
foreach(var error in wsResponse.errors)
{
KeyValuePair<string, string> kvpError = new KeyValuePair<string,string>();
kvpError = JsonConvert.DeserializeObject<KeyValuePair<string, string>>(
error.ToString());
}
=&GT;但它效果不好......
您对如何解决我的问题有所了解吗?
答案 0 :(得分: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; }
}
收率:
附注 - 如果您对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"
}
]
}