C#JSON反序列化数组/字典

C# JSON deserialization of array/dictionary

我必须结合Web服务(JSON)。我用javascriptserializer构建了一个带有序列化/反序列化的通信。

在99%的情况下,它的效果很好,但是…返回的错误详细信息如下:

1
{"result":"FAIL","error":{"error_code":1,"desc":"INVALID_DATA","details":{"city":["City cannot be blank."]}}}

要处理我创建的类:

1
2
3
4
5
6
public class ErrorObj
{
    public int error_code { get; set; }
    public string desc { get; set; }
    public Dictionary<string, string[]> details { get; set; }
}

但是sometimes的"细节"返回如下:

2

1
{"result":"FAIL","error":{"error_code":1,"desc":"INVALID_DATA","details":[]}}

要处理这个类,应该是这样的:

1
2
3
4
5
6
public class ErrorObj
{
    public int error_code { get; set; }
    public string desc { get; set; }
    public string[] details { get; set; }
}

如何构建对象(ErrorObj来处理所有错误消息?

反序列化代码:

1
2
3
4
5
6
7
8
9
public static T DeSerializeObjectFromJsonString<T>(string jsonString)
{
   T objectOut = default(T);
   Type outType = typeof(T);

   var obj = (T) new JavaScriptSerializer().Deserialize(jsonString, typeof(T));

  return obj;
}

错误信息:

0


这相当奇怪,因为WebService属性不应该在不同的结果中更改它的类型。

您可以通过更改details类型来处理它。

2

我还建议您坚持使用C命名约定,并对所有属性使用JsonProperty属性。

1
2
[JsonProperty("details")]
public JToken Details { get; set; }


您可以使用这样的模型对象。

public Dictionary details { get; set; }只使用dynamic而不是Dictionary

因为json字符串detail是不固定的。

1
2
3
4
5
6
7
8
9
10
11
12
public class Error
{
    public int error_code { get; set; }
    public string desc { get; set; }
    public dynamic details { get; set; }
}

public class ErrorObj
{
    public string result { get; set; }
    public Error error { get; set; }
}

如果你想知道,你得到了哪个JSON?

您可以使用detail.GetType()。检查类型是否为数组。

像这样简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string DictJson ="{"result":"FAIL","error":{"error_code":1,"desc":"INVALID_DATA","details":{"city":["City cannot be blank."]}}}";

string ArrayJson ="{"result":"FAIL","error":{"error_code":1,"desc":"ERROR_OPTIONS","details":["Specifying a bank account"]}}";

ErrorObj errorobj = DeSerializeObjectFromJsonString<ErrorObj>(ArrayJson);

if (errorobj.error.details.GetType().IsArray)
{
    //receive array detail
}
else
{
    //receive Dictionary<> detail
}