Estoy usando Spring's MappingJacksonHttpMessageConverter para convertir el mensaje JSON a objeto en mi controlador.Deserializar ArrayList desde String usando Jackson
<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>
Para los campos que se declaran como ArrayList, si el mensaje JSON contiene una cadena en lugar, se lanzará la siguiente excepción:
org.springframework.http.converter.HttpMessageNotReadableException:
Could not read JSON: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
Un ejemplo podría ser la definición de clase a continuación:
public class Product {
private String name;
private List<String> images;
}
Cuando el JSON entrante es:
{name:"Widget", images:"image1.jpg"}
Como puede ver, esto producirá la excepción ya que se espera que la imagen sea una matriz.
Me gustaría hacer un deserializador personalizado que sea un poco más tolerante. Si falla la deserialización, crea una ArrayList de un solo elemento de String. ¿Cómo voy a inyectar esto en MappingJacksonHttpMessageConverter u ObjectMapper?
No estoy buscando utilizar la anotación para marcar todos y cada uno de los campos ArrayList para que se pueda utilizar una deserialización personalizada. Estoy buscando una manera de sobrescribir el deserializador predeterminado para preformar esta función.
¿Cuál es la cadena original que está tratando de deserializar? –
dicen que es {producto: "1234"} en lugar de {producto: ["1234"]} – ltfishie
y ¿cómo intentas deserializarlo? ¿Puedes publicar algún código? –