得到JSON.如果泛型方法中的对象不是预期类型,Net将抛出异常

本文关键字:类型 Net 抛出异常 如果 JSON 泛型方法 对象 得到 | 更新日期: 2023-09-27 18:16:03

我创建了一个通用的反序列化方法,我将一个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可以是几乎任何格式-但关键是所需的类型被传递到方法中,这是应该返回的,否则应该抛出异常。

得到JSON.如果泛型方法中的对象不是预期类型,Net将抛出异常

没有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>();