Jackson Mapping List of String or simple String

7.6k views Asked by At

I'm trying to get some Json from an API and parse them into some POJO's to work with them but i have this case where i can get for a key a simple String or an arrayList of Strings.

The Json looks like this :

{
  "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"
        ]
      }
    }]
}

I'm using Spring Rest to get the result from the API. I created a POJO that represents categoriesKeys with a List<String> that defines categoryKey and in my RestTemplate I defined an ObjectMapper where i enabled DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY for the case of simple strings but this doesn't work!!

Any suggestions?

3

There are 3 answers

0
StaxMan On BEST ANSWER

In addition to global configuration already mentioned, it is also possible to support this on individual properties:

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;
}
0
Barath On

Since it is a List of keys it will work. if in case property has single value and not in array like below DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY will ensure deserializing single property as a 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"]}}}
0
Manos Nikolaidis On

I have tried this with just jackson outside Spring and it works as expected with:

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

Mind that RestTemplate registers a MappingJacksonHttpMessageConverter with it's own ObjectMapper. Check this answer for how to configure this ObjectMapper.