如何将Map <string,object =“”>反序列化为POJO?</string,>

时间:2014-08-22 12:57:57

标签: java serialization jackson gson

我有一个Map&lt; String,Object&gt;其中包含反序列化的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 + "]";
    }
}

4 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:12)

Jackson中,您可以使用convertValue方法。见下面的例子:

mapper.convertValue(map, MyPojo.class);

答案 2 :(得分:2)

您可以使用jackson库将地图对象转换为直接POJO。

+--------------------+-----+ 
| CustomerRelStatus  |count| 
+--------------------+-----+ 
|-1000Α-1000ν-1000...|  477| 
|-1000Κ-1000λ-1000...|   68| 
|-1000ʼ-1000γ-1000...|  291| 
|               -1000| 1165| 
+--------------------+-----+

答案 3 :(得分:1)

您可以通过为其提供地图来直接构建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");
}