将Json JObject转换为派生类

马克斯·索尼

我有一个名为NProcess的抽象类,将从中派生许多不同的Process对象。

public abstract class NProcess
{   
    public ProcessConfigurations ProcessSettings { get; set; } 
}

ProcessessConfigutations类如下所示:

[Browsable(true)]
public abstract class ProcessConfigurations { }

从NProcess派生的对象的示例是EmailReader, FileCopier or FTPProcess.....可以是任何东西,因此从ProcessConfigurations派生的属性类将具有一组仅与流程相关的属性。

我能够加载从Nprocess使用Reflection派生的过程,并且当我选择一个时,将按预期在属性网格中显示一组不同的属性。

我正在序列化设置并将其作为BSON存储在数据库中。

问题:反序列化向我显示了Json字符串,但出现以下错误:

无法将类型'Newtonsoft.Json.Linq.JObject'隐式转换为'ProcessConfigurations'

我需要能够将JObject强制转换或转换为从'ProcessConfigurations'派生的任何动态Type,但是我无法获取派生的类型。

海鱼

如果每个配置都是不同的类,那么当它们从数据库中出来时,您怎么知道它们应该是什么类型?假设您查询数据库并返回

{ "SourceFullPath": "c\\Source", "Destination": "c:\\temp", "OnExists": 1 }

您不知道应该将其反序列化为哪种具体类型。而且,您不能仅将其填充到ProcessConfigurations类中,因为abstract无法实例化类(反序列化器从概念上讲需要“新建”一个对象,然后将JSON属性复制到其中)。

所以,你可以做什么?

直接的答案是在序列化的Json中包括类型信息。Json.Net具有一项功能,它将自动为您执行此操作。它称为TypeNameHandling生成的Json看起来像:

{ "$type": "Your.Namespace.Here.MyConcreteProcessConfiguration, Your.Assembly.Here", "SourceFullPath": "c\\Source", "Destination": "c:\\temp", "OnExists": 1 }

然后,当反序列化时,Json.Net将知道要“更新”哪种类型。

如果您不想使用Json.Net的内置方法来执行此操作,则必须将类型信息存储在自己的字段中,并编写JsonConverter@JDB链接中提到的自定义JSON.NET反序列化为抽象类或接口JsonConverter实际上,该代码会反序列化(取自上述博客文章):

public class MyConverter : JsonConverter {

    // ... other stuff, see the blog article

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        if (jo["MyCustomType"].Value<string>() == "MyConcreteProcessConfiguration")
            return jo.ToObject<MyConcreteProcessConfiguration>(serializer);

        if (jo["MyCustomType"].Value<string>() == "MyOtherConcreteProcessConfiguration")
            return jo.ToObject<MyOtherConcreteProcessConfiguration>(serializer);

       return null;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将基类数组转换为派生类数组

来自分类Dev

将基类转换为派生类

来自分类Dev

通过反射将基类转换为派生类

来自分类Dev

将基类的指针转换为派生类(参考)

来自分类Dev

将基础对象转换为派生类

来自分类Dev

将PTR转换为派生类的PTR

来自分类Dev

C ++-将基类指针转换为派生类指针

来自分类Dev

将指向派生类的指针数组转换为指向基类的指针数组

来自分类Dev

将容器中的基类向下转换为派生类

来自分类Dev

将基础转换为派生类时,在编译时不抛出错误

来自分类Dev

如何将List <T>强制转换为T的派生类

来自分类Dev

将基础转换为派生类时,在编译时不抛出错误

来自分类Dev

将一阶派生类转换为二阶派生类-为什么起作用?

来自分类Dev

派生类没有额外的数据成员;将基础对象静态转换为派生对象是否安全?

来自分类Dev

将基类转换为派生类或在基类上创建虚拟函数会更好吗?

来自分类Dev

在这种情况下,将基类的对象强制转换为EMPTY派生类是不安全的

来自分类Dev

是否将reinterpret_cast的派生类指针转换为基类指针未定义的行为?

来自分类Dev

将BaseType转换为派生的通用类

来自分类Dev

我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?

来自分类Dev

将任何指向同一派生类实例的指针向上转换为虚拟基指针将始终返回相同的地址吗?C ++

来自分类Dev

dynamic_cast将“ this”转换为派生类型:什么时候合法?

来自分类Dev

如何将基础类型列表动态转换为派生类型

来自分类Dev

无法将基本实例的对象转换为派生类型(泛型用法)

来自分类Dev

将JObject转换为Collection

来自分类Dev

将父类的const引用转换为派生的子对象

来自分类Dev

Json.NET将linq结果转换为IEnumerable <JObject>

来自分类Dev

防止派生类转换为基类

来自分类Dev

将派生类转换为基类

来自分类Dev

无法转换为派生类的继承类字段

Related 相关文章

  1. 1

    将基类数组转换为派生类数组

  2. 2

    将基类转换为派生类

  3. 3

    通过反射将基类转换为派生类

  4. 4

    将基类的指针转换为派生类(参考)

  5. 5

    将基础对象转换为派生类

  6. 6

    将PTR转换为派生类的PTR

  7. 7

    C ++-将基类指针转换为派生类指针

  8. 8

    将指向派生类的指针数组转换为指向基类的指针数组

  9. 9

    将容器中的基类向下转换为派生类

  10. 10

    将基础转换为派生类时,在编译时不抛出错误

  11. 11

    如何将List <T>强制转换为T的派生类

  12. 12

    将基础转换为派生类时,在编译时不抛出错误

  13. 13

    将一阶派生类转换为二阶派生类-为什么起作用?

  14. 14

    派生类没有额外的数据成员;将基础对象静态转换为派生对象是否安全?

  15. 15

    将基类转换为派生类或在基类上创建虚拟函数会更好吗?

  16. 16

    在这种情况下,将基类的对象强制转换为EMPTY派生类是不安全的

  17. 17

    是否将reinterpret_cast的派生类指针转换为基类指针未定义的行为?

  18. 18

    将BaseType转换为派生的通用类

  19. 19

    我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?

  20. 20

    将任何指向同一派生类实例的指针向上转换为虚拟基指针将始终返回相同的地址吗?C ++

  21. 21

    dynamic_cast将“ this”转换为派生类型:什么时候合法?

  22. 22

    如何将基础类型列表动态转换为派生类型

  23. 23

    无法将基本实例的对象转换为派生类型(泛型用法)

  24. 24

    将JObject转换为Collection

  25. 25

    将父类的const引用转换为派生的子对象

  26. 26

    Json.NET将linq结果转换为IEnumerable <JObject>

  27. 27

    防止派生类转换为基类

  28. 28

    将派生类转换为基类

  29. 29

    无法转换为派生类的继承类字段

热门标签

归档