字符串或简单字符串的 Jackson 映射列表
Jackson Mapping List of String or simple String
我正在尝试从 API 中获取一些 Json 并将它们解析为一些 POJO 以与它们一起使用,但我有这种情况,我可以获得一个简单的字符串或键一个字符串数组列表。
Json 看起来像这样:
{
"offerDisplayCategoryMapping": [
{
"offerKey": "EUICC_BASE_ACTIVATION_V01",
"categoriesKeys": {
"categoryKey": "Included"
}
},
{
"offerKey": "EUICC_BASE_ACTIVATION_V02",
"categoriesKeys": {
"categoryKey": "Included"
}
},
{
"offerKey": "EUICC_BASE_ACTIVATION_V03",
"categoriesKeys": {
"categoryKey": [
"Option",
"Included"
]
}
}]
}
我正在使用 Spring Rest 从 API 中获取结果。我创建了一个代表 categoriesKeys
的 POJO,其中 List<String>
定义了 categoryKey
,在我的 RestTemplate
中,我定义了一个 ObjectMapper
,其中我启用了 DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
简单字符串的情况,但这不起作用!!
有什么建议吗?
因为它是一个键列表,所以它会起作用。如果万一 属性 有单个值而不是像下面这样的数组
DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY 将确保将单个 属性 反序列化为数组
{
"CategoriesKeys":{
"categoryKey":{
"keys":"1"
}
}
}
@JsonRootName("CategoriesKeys")
protected static class CategoriesKeys{
private CategoryKey categoryKey;
//getters and setters
}
protected static class CategoryKey{
private List<String> keys;
//getters and setters
}
TestClass:
ObjectMapper mapper=new ObjectMapper();
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
Output:
{"CategoriesKeys":{"categoryKey":{"keys":["1"]}}}
我已经在 Spring 外面用 jackson 试过了,它按预期工作:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
请注意 RestTemplate
用它自己的 ObjectMapper
注册了一个 MappingJacksonHttpMessageConverter
。 Check this answer 了解如何配置此 ObjectMapper
。
除了已经提到的全局配置之外,还可以在单个属性上支持它:
public class Container {
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
// ... could also add Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED
public List<String> tags;
}
我正在尝试从 API 中获取一些 Json 并将它们解析为一些 POJO 以与它们一起使用,但我有这种情况,我可以获得一个简单的字符串或键一个字符串数组列表。
Json 看起来像这样:
{
"offerDisplayCategoryMapping": [
{
"offerKey": "EUICC_BASE_ACTIVATION_V01",
"categoriesKeys": {
"categoryKey": "Included"
}
},
{
"offerKey": "EUICC_BASE_ACTIVATION_V02",
"categoriesKeys": {
"categoryKey": "Included"
}
},
{
"offerKey": "EUICC_BASE_ACTIVATION_V03",
"categoriesKeys": {
"categoryKey": [
"Option",
"Included"
]
}
}]
}
我正在使用 Spring Rest 从 API 中获取结果。我创建了一个代表 categoriesKeys
的 POJO,其中 List<String>
定义了 categoryKey
,在我的 RestTemplate
中,我定义了一个 ObjectMapper
,其中我启用了 DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
简单字符串的情况,但这不起作用!!
有什么建议吗?
因为它是一个键列表,所以它会起作用。如果万一 属性 有单个值而不是像下面这样的数组 DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY 将确保将单个 属性 反序列化为数组
{
"CategoriesKeys":{
"categoryKey":{
"keys":"1"
}
}
}
@JsonRootName("CategoriesKeys")
protected static class CategoriesKeys{
private CategoryKey categoryKey;
//getters and setters
}
protected static class CategoryKey{
private List<String> keys;
//getters and setters
}
TestClass:
ObjectMapper mapper=new ObjectMapper();
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
Output:
{"CategoriesKeys":{"categoryKey":{"keys":["1"]}}}
我已经在 Spring 外面用 jackson 试过了,它按预期工作:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
请注意 RestTemplate
用它自己的 ObjectMapper
注册了一个 MappingJacksonHttpMessageConverter
。 Check this answer 了解如何配置此 ObjectMapper
。
除了已经提到的全局配置之外,还可以在单个属性上支持它:
public class Container {
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
// ... could also add Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED
public List<String> tags;
}