Java 如何反序列化映射<;字符串,对象>;去波乔?

Java 如何反序列化映射<;字符串,对象>;去波乔?,java,serialization,jackson,gson,Java,Serialization,Jackson,Gson,我有一个包含JSON反序列化形式的映射。我想将其反序列化到POJO的字段中 我可以使用Gson将映射序列化为JSON字符串,然后将JSON字符串反序列化为POJO来执行此操作,但这是低效的(参见下面的示例)。如果没有中间步骤,我如何执行此操作 解决方案最好使用Gson或Jackson,因为项目已经在使用它们 示例代码: import java.util.HashMap; import java.util.Map; import com.google.gson.Gson; public cla

我有一个包含JSON反序列化形式的映射。我想将其反序列化到POJO的字段中

我可以使用Gson将映射序列化为JSON字符串,然后将JSON字符串反序列化为POJO来执行此操作,但这是低效的(参见下面的示例)。如果没有中间步骤,我如何执行此操作

解决方案最好使用Gson或Jackson,因为项目已经在使用它们

示例代码:

import java.util.HashMap;
import java.util.Map;

import com.google.gson.Gson;

public class Test {
    public static void main(String[] args) {
        Map<String, Object> innermap = new HashMap<String, Object>();
        innermap.put("number", 234);
        innermap.put("string", "bar");
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("number", 123);
        map.put("string", "foo");
        map.put("pojo2", innermap);

        Gson gson = new Gson();

        // How to perform this without JSON serialization?
        String json = gson.toJson(map);
        MyPojo pojo = gson.fromJson(json, MyPojo.class);

        System.out.println(pojo);
    }
}


class MyPojo {
    private int number;
    private String string;
    private MyPojo pojo2;

    @Override
    public String toString() {
        return "MyPojo[number=" + number + ", string=" + string + ", pojo2=" + pojo2 + "]";
    }
}
import java.util.HashMap;
导入java.util.Map;
导入com.google.gson.gson;
公开课考试{
公共静态void main(字符串[]args){
Map innermap=新的HashMap();
innermap.put(“数字”,234);
innermap.put(“字符串”、“条”);
Map Map=newhashmap();
地图放置(“编号”,123);
地图放置(“字符串”、“foo”);
地图放置(“pojo2”,innermap);
Gson Gson=新的Gson();
//如何在没有JSON序列化的情况下执行此操作?
字符串json=gson.toJson(map);
MyPojo-pojo=gson.fromJson(json,MyPojo.class);
系统输出打印LN(pojo);
}
}
MyPojo类{
私有整数;
私有字符串;
私营部门MyPojo pojo2;
@凌驾
公共字符串toString(){
返回“MyPojo[number=“+number+”,string=“+string+”,pojo2=“+pojo2+””;
}
}

Jackson
中,您可以使用该方法。请参见以下示例:

mapper.convertValue(map, MyPojo.class);

通过给MyPojo提供映射,可以直接构造它。 差不多

MyPojo pojo = new MyPojo(map);
并声明相应的构造函数:

public MyPojo(Map<String, Object> map){
  this.number=map.get("number");
  this.string=map.get("string");
  this.pojo2=new MyPojo(); // I don't know if this is possible
  this.pojo2.string=map.get("pojo2").get("string");
  this.pojo2.number=map.get("pojo2").get("number");
}
publicmypojo(地图){
this.number=map.get(“number”);
this.string=map.get(“string”);
this.pojo2=new MyPojo();//我不知道这是否可行
this.pojo2.string=map.get(“pojo2”).get(“string”);
this.pojo2.number=map.get(“pojo2”).get(“number”);
}

使用Gson,您可以将地图转换为一个
JsonElement
,然后使用
fromJson
以完全相同的方式解析:

JsonElement jsonElement = gson.toJsonTree(map);
MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class);

这类似于您已经使用的
toJson
方法,只是它避免了写入JSON字符串表示,然后在将该JSON字符串转换为类之前将其解析回JsonElement。

您可以使用jackson库将映射对象转换为直接POJO

Map<String, String> map = new HashMap<>();
map.put("id", "5");
map.put("name", "Bob");
map.put("age", "23");
map.put("savings", "2500.39");

ObjectMapper mapper = new ObjectMapper();
MyPojo pojo = mapper.convertValue(map, MyPojo.class);
Map Map=newhashmap();
地图放置(“id”、“5”);
地图。放置(“名称”、“鲍勃”);
地图放置(“年龄”、“23”);
map.put(“储蓄”、“2500.39”);
ObjectMapper mapper=新的ObjectMapper();
MyPojo-pojo=mapper.convertValue(map,MyPojo.class);

我希望避免显式映射,因为我有许多不同的类要从中进行反序列化。这正是我想要的。Michal的Jackson答案同样有效,但我们更多地使用Gson,因此它更适合我们的需要。可能是重复的