繁体   English   中英

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

[英]C# JSON deserialization of array/dictionary

我必须使用Web服务(json)。 我使用JavaScriptSerializer建立了序列化/反序列化的通信。

在99%的情况下都可以正常工作,但是...返回的错误详细信息如下:

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

为了处理我创建的类:

public class ErrorObj
{
    public int error_code { get; set; }
    public string desc { get; set; }
    public Dictionary<string, string[]> details { get; set; }
}

但是这样返回somtethimes的“详细信息”:

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

要么

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

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

public class ErrorObj
{
    public int error_code { get; set; }
    public string desc { get; set; }
    public string[] details { get; set; }
}

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

反序列化代码:

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

错误信息:

System.InvalidOperationException:类型'System.Collections.Generic.Dictionary`2 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String [],mscorlib,Version = 4.0 .0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'不支持数组反序列化。

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

public Dictionary<string, string[]> details { get; set; } public Dictionary<string, string[]> details { get; set; } public Dictionary<string, string[]> details { get; set; } ,只需使用dynamic而不是Dictionary<string, string[]>

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

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() 要检查类型是否为数组。

像这样简单

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
}

这非常奇怪,因为webservice属性不应在不同结果中更改其类型。

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

public JToken details { get; set; }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM