【发布时间】:2014-07-27 16:31:06
【问题描述】:
我有一个如下所示的 Json:
{
"testEntities" : [ {
"id" : 1,
"floatNumber" : 0.006117165,
"floatNumberObject" : 0.15273619,
"intNumber" : -1155869325,
"intNumberObject" : 431529176,
"doubleNumber" : 0.41008081149220166,
"doubleNumberObject" : 0.20771484130971707,
"shortNumber" : 9364,
"shortNumberObject" : 13977,
"booleanValue" : true,
"booleanValueObject" : true,
"byteValue" : -79,
"charValue" : "e",
"charValueObject" : "b",
"creationDate" : 86400000
}, {
"id" : 2,
"floatNumber" : 0.9874208,
"floatNumberObject" : 0.45285606,
"intNumber" : -1154715079,
"intNumberObject" : 1260042744,
"doubleNumber" : 0.9014476240300544,
"doubleNumberObject" : 0.49682259343089075,
"shortNumber" : 483,
"shortNumberObject" : 18322,
"booleanValue" : false,
"booleanValueObject" : true,
"byteValue" : -73,
"charValue" : "c",
"charValueObject" : "r",
"creationDate" : 172800000
} ]
}
当我尝试反序列化它时,它失败了:
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Root name 'testEntities' does not match expected ('TestObject[]') for type
我已经启用了数组反序列化:
objectMapper.enable(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY);
显然,testEntities 是杰克逊一无所知的自定义名称。 TestObject 类有一个我创建的名为 JsonRootNamePlural 的自定义注释,当根元素是一个集合而不是单个实例时使用:
@JsonRootName("testEntity")
@JsonRootNamePlural("testEntities")
public class TestObject {
...
}
系统的其他地方也需要这个注解。
我希望它以与使用 @JsonRootName 注释相同的方式使用它,但数组除外。所以它可以查找 JsonRootName 指示的根元素,如果没有找到,它可以查找 @JsonRootNamePlural。 Jackson 应忽略 JSON 中的所有其他根名称。
问题是,我应该重写或自定义什么来引入这种行为?
非常感谢任何帮助或指点,谢谢!
【问题讨论】:
标签: java arrays json jackson deserialization