我正在尝试使用
将 HashMap 数据解析为 POJOObject parsedMessage = objectMapper.convertValue(receivedMessage, destinationClass);
其中 receiveMessage 是一个 HashMap(之前从 JSON 解析)并包含各种类型的字段 - 整数、 boolean 值、字符串、LinkedHashMap。
我已经定义了destinationClass,以便它包含一些在HashMap键中找到的字段,并且恰好与键相同的名称(区分大小写)。
指令执行时没有异常,但 parsedMessage 中的所有字段均为null。可能是什么原因?类似的指令在代码的其他位置工作得很好。
最佳答案
我已经解决了。
事实证明,无论 destinationClass 中的 Java 字段如何命名,Jackson(至少默认情况下)都假定它以小驼峰命名。 因此,如果您的 HashMap 具有“YourField”并且您的 POJO 具有相同的“YourField”,那么如果您不从两端开始都使用小驼峰命名法,那么它将无法工作! (如果您解析序列化的 .NET JSON,您最终会得到 UpperCamelCase)。
因为Jackson假设你的POJO的“YourField”被命名为“yourField”用于匹配!
要解决此问题,可以:
您的 HashMap 键必须采用小驼峰命名法。
或者
创建具有不区分大小写行为的映射器
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) 因此,如果您尝试解析未描述的字段,则不会出现异常。
关于java - Jackson ObjectMapper解析HashMap返回所有字段= NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40649030/