Десериализовать ArrayList из строки с помощью Jackson

Я использую Spring MappingJacksonHttpMessageConverter для преобразования сообщения JSON в объект в моем контроллере.

<bean id="jsonConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="prefixJson" value="false" />
    <property name="supportedMediaTypes" value="application/json" />
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonConverter" />
        </list>
    </property>
</bean>

Для полей, объявленных как ArrayList, если вместо этого сообщение json содержит строку, будет выдано следующее исключение:

org.springframework.http.converter.HttpMessageNotReadableException: 
 Could not read JSON: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token

Примером может служить определение класса ниже:

public class Product {
   private String name;
   private List<String> images;
}

Если входящий Json:

{name:"Widget", images:"image1.jpg"}

КАК вы можете видеть, это приведет к возникновению исключения, поскольку Ожидается, что изображение будет массивом.

Я хотел бы сделать пользовательский десериализатор, который немного более терпим. Если десериализация не удалась, создайте ArrayList из одного элемента из строки. Как мне внедрить это в MappingJacksonHttpMessageConverter или ObjectMapper?

Я не собираюсь использовать аннотацию для маркировки каждого поля ArrayList, чтобы можно было использовать пользовательскую десериализацию.Я ищу способ перезаписать десериализатор по умолчанию для выполнения этой функции.

6
задан ltfishie 23 April 2012 в 14:41
поделиться