我正在尝试使用
将HashMap数据解析为POJOObject parsedMessage = objectMapper.convertValue(receivedMessage, destinationClass);
其中receivedMessage是一个HashMap(早先从JSON解析)并包含各种类型的字段 - Integer,Boolean,String,LinkedHashMap。
我已经定义了 destinationClass ,因此它包含在HashMap密钥中找到的字段的 一些 ,与键名称相同(区分大小写)。
指令执行时没有异常,但parsedMessage中的所有字段都是 null 。可能是什么原因?类似的指令在其他代码处也可以正常工作。
答案 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) 因此,如果您尝试解析未描述的字段,则不会出现异常。