NewtonSoft JsonConvert反序列化动态对象类型

时间:2014-04-21 20:37:59

标签: c# json json.net

我有一个抽象对象Item,它有几个子节点:RadioItem,CheckItem等。

每个项目都将自己的属性存储在序列化的JSON字符串属性中。

我试图创建一个可以接收Item的静态类,从JSON字符串中实例化一个新项并返回它。

现在我的代码看起来像这样:

public static Item GetFreshItem(Item dirtyItem)
{
    string itemProperties = dirtyItem.InitialItemSettingsJSON;

    if (dirtyItem is RadioItem)
    {
        return JsonConvert.DeserializeObject<RadioItem>(itemProperties);
    }

    if (dirtyItem is CheckItem)
    {
        return JsonConvert.DeserializeObject<CheckItem>(itemProperties);
    }
    return null;
}

有没有办法没有一长列If(x是Type)并使用更动态的单一return语句,具体取决于传入的类型?

我当时认为它是这样的(它不起作用)

JsonConvert.DeserializeObject<typeOf(dirtyItem)>(itemProperties);

2 个答案:

答案 0 :(得分:3)

我认为你正在寻找反序列化方法的(string, Type) overload

string itemProperties = dirtyItem.InitialItemSettingsJSON;
return (Item)JsonConvert.DeserializeObject(itemProperties, dirtyItem.GetType());

答案 1 :(得分:0)

你也可以这样做:

public static T GetFreshItem<T>(T dirtyItem) where T:Item
{
    string itemProperties = dirtyItem.InitialItemSettingsJSON;
    return JsonConvert.DeserializeObject<T>(itemProperties);
}

这样你就不需要演员了。