是否可以使用ObjectMapper解析包含多个对象的JSON?例如
{
"employee": {
"name": "John",
"surname": "Smith",
"age": 30,
"department": "sales"
},
"department": {
"name": "sales",
"company": "abcd",
"lead": "Mr Harrison"
},
"company": {
"name": "abcd",
"location": "New York"
}
}
我可以在一个映射器运行中从该文件中获取Employee,Department,Company对象,例如:
ObjectMapper mapper = new ObjectMapper();
List of Objects = mapper.readValue(...)
或者不可能?
答案 0 :(得分:1)
创建一个包含您要查找的3个对象的父对象,并将它们读入该单个对象,然后使用该对象访问您的数据。
答案 1 :(得分:0)
如果我们考虑
的情况分别在一个文件中读取大量对象
,如果没有创建专用的包装器POJO,也可以实现,前提是您应该将目标对象类型的信息映射到JSON中的每个根级别键。
此信息可以用Map
:
Map<String, Class<?>> targetTypes = new HashMap<>();
targetTypes.put("employee", Employee.class);
targetTypes.put("department", Department.class);
targetTypes.put("company", Company.class);
反序列化必须分两步完成。第一个是将原始JSON转换为Map<String, Object>
:
String json = ... // the JSON
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> parsed = mapper.readValue(json, Map.class);
第二步是将此地图的键与目标类型相匹配,并将值转换为对象:
List<Object> objects = parsed.entrySet().stream().map(
(entry) -> {
Class<?> targetClass = targetTypes.get(entry.getKey());
return mapper.convertValue(entry.getValue(), targetClass);
}
).collect(Collectors.toList());
objects
列表现在包含
[
Employee(name=John, surname=Smith, age=30, department=sales),
Department(name=sales, company=abcd, lead=Mr Harrison),
Company(name=abcd, location=New York)
]