[英]Jackson: Deserialize map<String,Object> to Custom nested Pojo
[英]How to deserialize a Map<String, Object> into POJO?
我有一个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 + "]";
}
}
使用Gson,您可以将Map转换为JsonElement
,然后使用fromJson
以完全相同的方式解析fromJson
:
JsonElement jsonElement = gson.toJsonTree(map);
MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class);
这类似于您已经使用的toJson
方法,除了它避免编写JSON String表示,然后在将JSON String转换为类之前将其解析回JsonElement。
在Jackson
你可以使用convertValue方法。 见下面的例子:
mapper.convertValue(map, MyPojo.class);
您可以使用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);
您可以通过为其提供地图来直接构建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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.