Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enforce ACCEPT_SINGLE_VALUE_AS_ARRAY in jackson's deserialization process using annotation

Is there a way to use annotation on a List property in a class to use ACCEPT_SINGLE_VALUE_AS_ARRAY in Jackson? I'm using Spring and getting the below exception

nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token

Assume I have a class as below:

public class MyClass {      private List < String > value; } 

And my JSON structures are as below:

case 1:

[{"operator": "in", "value": ["Active"], "property": "status"}] 

case 2:

[{"operator": "like", "value": "aba", "property": "desc"}] 

What annotation should I use to let the framework know I want these 2 cases to be treated the same when deserializing.

UPDATE: I moved the updates to an answer in this post for more clarity.

like image 478
Vahid Avatar asked Aug 19 '16 14:08

Vahid


1 Answers

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 your Bean Configuration

These would solve the issue but it will be activated for every deserialization process.

like image 79
Ömer Erden Avatar answered Sep 21 '22 09:09

Ömer Erden