Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ObjectMapper将Json转换为Java对象的最佳方式是什么?_Java_Json_Object_Objectmapper - Fatal编程技术网

使用ObjectMapper将Json转换为Java对象的最佳方式是什么?

使用ObjectMapper将Json转换为Java对象的最佳方式是什么?,java,json,object,objectmapper,Java,Json,Object,Objectmapper,我正在将Java对象转换为Json格式,以将它们保存到数据库中。当我从数据库中获取这些JSON时,我需要将它们转换为它们来自的对象。为此,我保存了对象的类型,当我从数据库中获取JSON时,我用if子句检查它们的对象类型,但我认为这不是存在lof对象的最佳方法。有没有最简单的方法可以做到这一点 数据库表结构: id | json_data | data_type -------------------------- 1 | "{a:1 ..} | TypeA -------------

我正在将Java对象转换为Json格式,以将它们保存到数据库中。当我从数据库中获取这些JSON时,我需要将它们转换为它们来自的对象。为此,我保存了对象的类型,当我从数据库中获取JSON时,我用if子句检查它们的对象类型,但我认为这不是存在lof对象的最佳方法。有没有最简单的方法可以做到这一点

数据库表结构:

id | json_data | data_type
--------------------------
 1 | "{a:1 ..} | TypeA
--------------------------
 2 | so on.......
将JSON转换为Java对象的Java示例:

ObjectMapper om = new ObjectMapper();
List<SpringEntityObject> allData = getAllDataFromDB();
for (SpringEntityObject o : allData) {
    if (o.getDataType().equals("TypeA")) {
        TypeA typeA = om.readValue(o.getJsonData(), TypeA.class);
        // there should be a simpler way to do this?
        ....
    } else if (o.getDataType().equals("TypeB")) {
        TypeB typeB = om.readValue(o.getJsonData(), TypeB.class);
        ....
    } ......
    else {....}
}

您可能遇到的主要问题是,每次添加新类时都需要更改这段代码

您可以将该类的全名和名称空间存储在data_type列中,并使用class.forName动态获取该类。这允许您在不更改反序列化代码的情况下添加类,这有助于维护

for (SpringEntityObject o : allData) {
    Class clazz = Class.forName(o.getDataType());
    Object deserializedObject = om.readValue(o.getJsonData(), clazz);
}

请注意,如果通过迁移脚本重命名/移动类名,则需要同步数据库中的类名。

您可能遇到的主要问题是每次添加新类时都需要更改此代码块

您可以将该类的全名和名称空间存储在data_type列中,并使用class.forName动态获取该类。这允许您在不更改反序列化代码的情况下添加类,这有助于维护

for (SpringEntityObject o : allData) {
    Class clazz = Class.forName(o.getDataType());
    Object deserializedObject = om.readValue(o.getJsonData(), clazz);
}

请注意,如果通过迁移脚本重命名/移动类名,则需要同步数据库中的类名。

如果使用JPA,则会得到它automatically@riorio我使用JPA,但我不能使这些对象的类可序列化,它们是从wsdl文件自动生成的类看看Jackson的多态反序列化:它可以配置为基于JSON中的属性反序列化到特定的类。这可能很难理解,但网上有很多文章和示例。我相信,通过使用JAXB绑定或您正在使用的任何东西,您可以使生成的类也可序列化。看看这个链接,如果你使用JPA,你会得到它automatically@riorio我使用JPA,但我不能使这些对象的类可序列化,它们是从wsdl文件自动生成的类看看Jackson的多态反序列化:它可以配置为基于JSON中的属性反序列化到特定的类。这可能很难理解,但网上有很多文章和示例。我相信,通过使用JAXB绑定或您正在使用的任何东西,您可以使生成的类也可序列化。看看这里的链接