反序列化包含对象

时间:2015-09-16 13:36:58

标签: c# json web-services serialization json.net

我在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;但它效果不好......

您对如何解决我的问题有所了解吗?

1 个答案:

答案 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; }
}

收率:

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"
    }
  ]
}