【问题标题】:Importing some values from hashmap to POJO将一些值从 hashmap 导入 POJO
【发布时间】:2019-09-18 00:50:46
【问题描述】:

我想将 Hashmap 类型转换为 POJO。我目前正在使用 jackson 对其进行转换,但是,由于该请求是 API 请求,因此用户可能会提供比需要更多的字段。 例如, 哈希图可以是:

{
  field1ID:"hi",
  field2ID:["HI","HI","JO"],
  field3ID:"bye"
}

虽然pojo很简单

{
  field1ID:"hi",
  field3ID:"bye"
}

当使用ObjectMapper.convertValue 时,除非存在从 hashmap 到 pojo 的一对一映射,否则将抛出 IllegalArguemetException。我要做的是,如果该字段存在,则映射该字段。否则将其保留为空。

【问题讨论】:

标签: java jackson pojo


【解决方案1】:

由于您没有在问题中提供任何代码,请考虑,例如,您有一个如下所示的地图:

Map<String, Object> map = new HashMap<>();
map.put("firstName", "John");
map.put("lastName", "Doe");
map.put("emails", Arrays.asList("johndoe@mail.com", "john.doe@mail.com"));
map.put("birthday", LocalDate.of(1990, 1, 1));

并且您想将其映射到 Contact 的实例:

@Data
public class Contact {
    private String firstName;
    private String lastName;
    private List<String> emails;
}

可以通过以下代码实现:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Contact contact = mapper.convertValue(map, Contact.class);

在上面的示例中,映射有一个birthday 键,它不能映射到Contact 类的任何字段。为防止序列化失败,FAIL_ON_UNKNOWN_PROPERTIES 功能已被禁用。


或者,您可以使用@JsonIgnoreProperties 注释Contact 类并将ignoreUnknown 设置为true

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Contact {
    ...
}

然后进行转换:

ObjectMapper mapper = new ObjectMapper();
Contact contact = mapper.convertValue(map, Contact.class);

要将Contact 实例转换回地图,您可以使用:

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.convertValue(contact, 
        new TypeReference<Map<String, Object>>() {});

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多