字符串或简单字符串的 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 注册了一个 MappingJacksonHttpMessageConverterCheck 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;
}