【问题标题】:Mapping a flat map to a nested pojo in jackson将平面地图映射到 jackson 中的嵌套 pojo
【发布时间】:2018-02-02 09:52:11
【问题描述】:

如何将平面地图映射到嵌套的 pojo? 我试过使用它,但是我在野战剑上得到了一个无法识别的字段异常。

Map<String, Object> values = ...;
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(mapper.writeValueAsString(values), Person.class);

我有这个虚拟 json:

{
  "firstName": "Arya",
  "lastName": "Stark",
  "gender": "Female",
  "sword" : "Excalibur",
  "shield": "Mighty Shield"
}

一个人类:

@Data
@AllArgsConstructor
public class Person {

 private String firstName;
 private String lastName;
 private Equipment equipments;

}

和一个设备类:

@Data
@AllArgsConstructor
public class Equipment {

 private String sword;
 private String shield;

}

【问题讨论】:

标签: java jackson objectmapper


【解决方案1】:

我看到了解决这个问题的方法:

public class Test {
    public static void main(String[] args) {
        Map<String, Object> values = new HashMap<>();

        values.put("firstName", "Arya");
        values.put("lastName", "Stark");
        values.put("gender", "Female");
        values.put("sword", "Excalibur");
        values.put("shield", "Mighty Shield");
        ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        Person person = mapper.convertValue(values, Person.class);
        person.setEquipments(mapper.convertValue(values, Equipment.class));

        System.out.println(person);

    }
}

当然,它不是单行反序列化,但它可以工作。结果:

Person(firstName=Arya, lastName=Stark, equipments=Equipment(sword=Excalibur, shield=Mighty Shield))

注意:将@NoArgsConstructor 添加到您的 POJO,Jackson 需要它。

【讨论】:

  • 如果返回的对象是List of Person而不是Person,如何将设备对象保存在相应的Person对象中。
【解决方案2】:

我认为当您将不同类别的属性收集到一张地图中时,您有一个错误。你为什么这样做?

如果您的 json 具有相同的结构,则可以轻松地将 json 转换为具有嵌套类的对象。在您的示例中,它应该是:

{ "person": { "firstName": "name", "lastName": "name2", "gender": "male", "equipment": { "sword": "s", "shield": "s2" } } }

那个json可以通过objectMapper.readValue(json, Person.class);轻松转换成Person.java

【讨论】:

  • 我也需要为其他 pojo 聚合 json,所以我需要它尽可能通用。
  • 然后,您的地图应该包含整个 json 的值,而不是属性。在这种情况下,您可以通过密钥获取准备好的 json 并将其转换为 pojo。
  • @NikitaSalomatin,也许这个 JSON 是由关系数据库中的 CSV 文件或表构造的?在这种情况下,将字典映射作为输入结构是合理的。
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多