Jackson ObjectMapper解析HashMap会返回所有字段= NULL

时间:2016-11-17 07:30:13

标签: java json jackson objectmapper

我正在尝试使用

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

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

我已经定义了 destinationClass ,因此它包含在HashMap密钥中找到的字段的 一些 ,与键名称相同(区分大小写)。

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

1 个答案:

答案 0 :(得分:3)

我已经解决了。

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

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

要解决此问题,请:

你的HashMap键必须是lowerCamelCase。

OR

使用不区分大小写的行为创建Mapper

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

OR

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

中使用注释
   @JsonProperty("YourField")
   private String YourField;

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