![](/img/trans.png)
[英]json newtonsoft : Deserialize Object containing a list of string
[英]Deserialize a Json containing a list of object
我在UniversalApp上工作,该应用程序调用了许多返回JSON数据的Web服务。
所有的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());
在其他情况下,必须先在结果对象中反序列化,然后再反序列化数据:
WsResponse wsResponse = JsonConvert.DeserializeObject<WsResponse>(response);
WsResponseResult wsResponseResult = JsonConvert.DeserializeObject<WsResponseResult>(
wsResponse.data.ToString());
List<Theme> themes = JsonConvert.DeserializeObject<List<Theme>>(
wsResponseResult.result.ToString());
但是,如果状态为“ failure ”,则需要捕获错误列表。 但是我无法反序列化此对象列表...这是一个当Web服务包含错误时从Web服务获取的JSON数据的示例:
{
"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());
=>但它不起作用
我还尝试对错误数据进行反序列化之前将它们反序列化:
foreach(var error in wsResponse.errors)
{
KeyValuePair<string, string> kvpError = new KeyValuePair<string,string>();
kvpError = JsonConvert.DeserializeObject<KeyValuePair<string, string>>(
error.ToString());
}
=>但效果不佳...
您对如何解决我的问题有想法吗?
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"
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.