[英]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.