How to enforce ACCEPT_SINGLE_VALUE_AS_ARRAY in jackson's deserialization process using annotation
Solution 1:
You can use @JsonFormat annotation,
public class MyClass {
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<String> value;
}
To work with this you need to have Jackson version min 2.7.0
. You can also use other available JsonFormat Features
For version 2.6.x
@Autowired private ObjectMapper mapper;
//...
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
- Add this code to your
Initializer Class
. - Or you can directly configure
Jackson
in yourBean Configuration
These would solve the issue but it will be activated for every deserialization
process.
Solution 2:
I'm just answering my own question for clarity. One of the answers was to upgrade to the higher version so that I can use annotations. I cannot do it due to dependency restrictions of my project.
As a result, based on Michal Foksa answer I solved my problem by creating a custom deserializer. Its as below:
On my property:
@JsonDeserialize(using = CustomStringDeserializer.class)
private List<String> value;
And my Deserializer:
public class CustomStringDeserializer extends JsonDeserializer<List<String>>{
@Override
public List<String> deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature. ACCEPT_SINGLE_VALUE_AS_ARRAY);
return mapper.readValue(p, List.class);
}
}