我正在使用第三方API,它为同一个JSON属性返回三种不同的类型,具体取决于它包含多少个嵌套对象。我试图找出使用Jackson(最好使用Retrofit)处理反序列化这些对象的最佳方法。
简化示例:从此API检索客户记录时,响应可能是以下任何一个:
客户有多个电话号码;返回PhoneObjects
{
"Phones": {
"PhoneObject":[
{"number":"800 555 6666","type":"Home"},
{"number":"800 555 4444","type":"Work"}
]
}
}
客户有一个电话号码;返回一个PhoneObject
{
"Phones": {
"PhoneObject": {"number":"800 555 6666","type":"Home"}
},
}
客户没有电话号码;返回一个空字符串(!)
{
"Phones": {
"PhoneObject":""
}
}
目前,我通过将杰克逊反序列化为Map<String, Object>
并检查Object
以确定它是什么类型,然后将其插入,例如, a List<PhoneObject>
(如果对象不存在,则返回空列表)。然而,这很麻烦,并希望找到一种更清晰的方法来反序列化这些对象。
答案 0 :(得分:3)
我能够将所有3个JSON字符串解析为此Phones
类
class Phones {
@JsonProperty("PhoneObject")
private List<PhoneObject> phoneObjects;
}
使用此ObjectMapper
配置:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
ACCEPT_SINGLE_VALUE_AS_ARRAY允许将值解析为大小为1的列表。
ACCEPT_EMPTY_STRING_AS_NULL_OBJECT允许将空字符串解析为null。在这种情况下,phoneObjects
最终为null
。不太理想,但我不知道在这里找到一个空列表的简单方法。
根据您的POJO,您可能需要UNWRAP_ROOT_VALUE,也可能不需要。{/ p>