使用Json.NET反序列化枚举值

时间:2014-09-26 08:02:08

标签: c# json enums json.net deserialization

我有一个从JSON反序列化的JValue,这个值代表一个枚举。考虑这两种情况:

JValue value = ...

object o1 = value.ToObject(typeof(MyEnum));
object o2 = value.ToObject<MyEnum>();

o1的类型为整数,并且包含枚举的数值

o2的类型为enum,并保存枚举值

为什么ToObject方法在这两种情况下的工作方式不同?

1 个答案:

答案 0 :(得分: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。这就是为什么在第一种情况下我们得到数字而在第二种情况下得到枚举值。