gson 如何将Map〈String,Object>反序列化为POJO?

koaltpgm  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(209)

我有一个Map〈String,Object〉,它包含一个反序列化形式的JSON。我想把它反序列化到POJO的字段中。
我可以使用Gson将Map序列化为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 + "]";
    }
}
mbzjlibv

mbzjlibv1#

使用Gson,可以将Map转换为JsonElement,然后可以使用fromJson以完全相同的方式解析它:

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

这类似于您已经使用的toJson方法,不同之处在于它避免了编写JSON String表示形式,然后在将JSON String转换为类之前将其解析回JsonElement。

uqcuzwp8

uqcuzwp82#

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

mapper.convertValue(map, MyPojo.class);
3lxsmp7m

3lxsmp7m3#

您可以使用Jackson库将Map对象转换为直接的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);
7tofc5zh

7tofc5zh4#

你可以通过给它Map来直接构建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");
}

相关问题