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; } } |
如何构建对象(
反序列化代码:
1 2 3 4 5 6 7 8 9 |
错误信息:
0这相当奇怪,因为WebService属性不应该在不同的结果中更改它的类型。
您可以通过更改
我还建议您坚持使用C命名约定,并对所有属性使用
1 2 | [JsonProperty("details")] public JToken Details { get; set; } |
您可以使用这样的模型对象。
因为json字符串
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?
您可以使用
像这样简单
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 } |