代码之家  ›  专栏  ›  技术社区  ›  Ewgenij Sokolovski

JSON Java数据绑定用于多个POJOs

  •  0
  • Ewgenij Sokolovski  · 技术社区  · 7 年前

    是否可以使用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 回复  |  直到 7 年前
        1
  •  0
  •   Antot    7 年前

    如果我们考虑

    在一个文件中分别读取多个对象

    ,而不创建专用的包装器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)
    ]
    
        2
  •  1
  •   Adam Pine    7 年前

    创建包含您要查找的3个对象的父对象,并将它们读入该单个对象中,然后使用该对象访问您的数据。