2016-11-17 196 views
1

我试图使用到的HashMap数据解析成POJOHashMap中的杰克逊ObjectMapper解析返回所有字段= NULL

Object parsedMessage = objectMapper.convertValue(receivedMessage, destinationClass); 

其中receivedMessage是一个HashMap(从JSON更早解析)和各种类型的包含字段 - 整数,布尔,字符串,LinkedHashMap。

我已经定义destinationClass,以便它包含在HashMap的键发现场的一些,具有完全相同的名称作为关键字(区分大小写)。

该指令无例外地执行,但parsedMessage中的所有字段都是null。可能是什么原因?类似的指令在其他代码中工作得很好。

+0

你的代码和POJO类是什么? – Jerry06

+0

HashMap中的简单“Id:1”键值对不会被转换为Integer Id = 1作为对象字段@ Jerry06 –

+0

我看到它与jackson 2.4 – Jerry06

回答

3

我已经解决了。

事实证明,不管如何destinationClass你的Java领域命名,杰克逊(至少,在默认情况下),假设它在lowerCamelCase命名。 因此,如果你的散列表有“YourField”,并且你的POJO具有相同的“YourField”,那么它将不起作用如果你从头两端不使用lowerCamelCase! (如果解析序列化的.NET JSON,则最终会得到UpperCamelCase)。

因为杰克逊假设您的POJO的“YourField”被命名为“yourField”进行匹配!

为了解决这个问题,或者:

你的HashMap的密钥必须lowerCamelCase。

OR

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

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; 

注意使用annottaions:如果您想做某种“宽容读者”(http://martinfowler.com/bliki/TolerantReader.html),你可能会发现基于类的注释@JsonIgnoreProperties(ignoreUnknown = true) ,所以如果你试图解析没有描述的字段,你将不会得到异常。