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

本文关键字:反序列化 类型 对象 JsonConvert 动态 NewtonSoft | 更新日期: 2023-09-27 17:59:18

我有一个抽象对象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)的长列表,而是根据传入的类型使用更动态的单返回语句?

我在想它会是这样的东西(不起作用)

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

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

我认为您正在寻找反序列化方法的(string, Type)重载。

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

您也可以执行以下操作:

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

这样你就不需要打石膏了。