【问题标题】:Deserializing enum value with Json.NET使用 Json.NET 反序列化枚举值
【发布时间】:2014-09-26 08:02:07
【问题描述】:
我有一个从 JSON 反序列化的 JValue,这个值代表一个枚举。考虑以下两种情况:
JValue value = ...
object o1 = value.ToObject(typeof(MyEnum));
object o2 = value.ToObject<MyEnum>();
o1 是整数类型并保存枚举的数值
o2 是枚举类型并保存枚举值
为什么 ToObject 方法在这两种情况下的工作方式不同?
【问题讨论】:
标签:
c#
json
enums
json.net
deserialization
【解决方案1】:
假设MyEnum 看起来像这样:
public enum MyEnum
{
First = 1,
Second,
Third
}
JValue 是这样定义的:
var value = new JValue(MyEnum.First);
当您调用以下行时:
object o1 = value.ToObject(typeof(MyEnum));
您正在调用ToObject 方法的非泛型重载。对于枚举,此方法解析枚举的基础类型,在本例中为int,并将对象转换为该值。这就是它返回数值的原因。 (在这种情况下为 1)。
当您调用ToObject 方法的泛型重载时:
object o2 = value.ToObject<MyEnum>();
从JValue得到结果,又是1,但是在返回值之前,被强制转换为泛型类型参数的类型。
更清楚地说,ToObject 方法的泛型重载如下所示:
public T ToObject<T>()
{
return (T)ToObject(typeof(T));
}
它调用非泛型重载(我们在第一种情况下使用),但它在返回之前将结果转换为T。这就是为什么在第一种情况下我们得到数字而在第二种情况下得到枚举值。