我创建了一个通用的反序列化方法,我将一个json字符串传递给它。T是我想要返回的类型。
private static T Deserialize<T>(string input)
{
try
{
var result = JsonConvert.DeserializeObject<T>(input);
return result;
}
catch (JsonSerializationException ex)
{
var errorResult = JsonConvert.DeserializeObject<Dictionary<string, string>>(input);
var errorMessage = errorResult["error"];
throw new ApplicationException(errorMessage, ex);
}
}
要调用这个方法我们选择
Deserialize<MyObject>(jsonString)
成功返回类型为MyObject
的对象。
然而,传入的json有时会包含错误消息(error: message),如果事情出错了。
在这种情况下,我想做的是引起JsonSerializationException并读取错误消息。
但是,不会抛出这样的错误,并返回MyObject,但全部为null和0值。
错误json"{"error":"Error message"}"
其他json "[{"path":"","id":2000,"name":"Name1"},{"path":"","id":2001,"name":"Name2"},{"path":"","id":2002,"name":"Name3"}]"
另一个json可以是几乎任何格式-但关键是所需的类型被传递到方法中,这是应该返回的,否则应该抛出异常。
没有JsonSerializationException,因为Json格式良好,但没有属性与类型T的属性匹配,所以结果是一个新的T对象。
我想说下面的代码应该可以工作://First, convert to JToken
var o = JsonConvert.DeserializeObject<JToken>(input);
//Then check if the property error exists
if(!(o is JArray) && o["error"] != null);
{
throw new Exception(...)
}
//Finally convert the object
return o.ToObject<T>();