如果对象不是Generic方法中的预期类型,则获取JSON.Net以抛出异常

时间:2016-11-02 15:49:05

标签: c# json.net

我创建了一个通用的反序列化方法,我将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有时可能包含错误消息(错误:消息)。

在这种情况下我想要做的是导致JsonSerializationException并读取错误消息。

但是,没有抛出这样的错误,并且MyObject被撤销,但是所有的null和零值都是。

错误json

"{\"error\":\"Error message"}"

其他json

"[{\"path\":\"\",\"id\":2000,\"name\":\"Name1\"},{\"path\":\"\",\"id\":2001,\"name\":\"Name2\"},{\"path\":\"\",\"id\":2002,\"name\":\"Name3\"}]"

另一个json可以是几乎任何格式 - 但重点是所需的Type被传递给方法,这应该返回或应该抛出异常。

1 个答案:

答案 0 :(得分:2)

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