【问题标题】:Jackson ObjectMapper parsing of HashMap returns all fields = NULLJackson ObjectMapper 解析 HashMap 返回所有字段 = NULL
【发布时间】:2016-11-17 07:30:13
【问题描述】:

我正在尝试使用

将 HashMap 数据解析为 POJO
Object parsedMessage = objectMapper.convertValue(receivedMessage, destinationClass);

其中 receivedMessage 是一个 HashMap(之前从 JSON 解析)并包含各种类型的字段 - Integer、Boolean、String、LinkedHashMap。

我已定义 destinationClass 以便它包含 一些 在 HashMap 键中找到的字段,与与键名相同(区分大小写)。

指令执行无异常,但parsedMessage中的所有字段都是null。可能是什么原因?类似的指令在其他代码位置也能正常工作。

【问题讨论】:

  • 你的代码和 POJO 类是哪个?
  • HashMap 中简单的“Id: 1”键值对不会转换为 Integer Id =1 作为对象字段@Jerry06
  • 我看到它与杰克逊 2.4 一起工作

标签: java json jackson objectmapper


【解决方案1】:

我已经解决了。

事实证明,无论 destinationClass 中的 Java 字段如何命名,Jackson(至少默认情况下)都假定它以 lowerCamelCase 命名。 因此,如果您的 hashmap 具有“YourField”并且您的 POJO 具有相同的“YourField”,那么它将不起作用(如果你解析序列化的 .NET JSON,你最终会得到 UpperCamelCase)。

因为 Jackson 假定您的 POJO 的“YourField”被命名为“yourField”以进行匹配!

要解决此问题,可以:

您的 HashMap 键必须是 lowerCamelCase。

创建不区分大小写的映射器

ObjectMapper om = new ObjectMapper();
om.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
return om;

为清楚起见,您可以在 POJO (https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations) 中使用注释

   @JsonProperty("YourField")
   private String YourField;

注意:如果你想通过部分解析来做某种“容忍阅读器”(http://martinfowler.com/bliki/TolerantReader.html),你可能会发现基于类的注释@JsonIgnoreProperties(ignoreUnknown = true) 因此,如果您尝试解析未描述的字段,则不会出现异常。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2021-04-14
    相关资源
    最近更新 更多