多个POJO的Json Java数据绑定

时间:2018-06-04 16:16:06

标签: jackson jackson-databind

是否可以使用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(...)

或者不可能?

2 个答案:

答案 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)
]