Sto utilizzando Spring's MappingJacksonHttpMessageConverter per convertire il messaggio JSON in oggetto nel mio controller.Deserialize ArrayList da String utilizzando 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>
Per i campi che vengono dichiarati come ArrayList, se il messaggio JSON contiene una stringa, invece, saranno gettati la seguente eccezione:
org.springframework.http.converter.HttpMessageNotReadableException:
Could not read JSON: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
Un esempio potrebbe essere la definizione della classe di seguito:
public class Product {
private String name;
private List<String> images;
}
Qualora il JSON in arrivo è:
{name:"Widget", images:"image1.jpg"}
AS si può vedere, questo produrrà l'eccezione poiché l'immagine dovrebbe essere una matrice.
Vorrei fare un deserializzatore personalizzato che è un po 'più tollerante. Se la deserializzazione fallisce, creare un ArrayList di un singolo elemento dalla stringa. Come faccio ad iniettare questo in MappingJacksonHttpMessageConverter o ObjectMapper?
Non sto cercando di utilizzare l'annotazione per contrassegnare ogni singolo campo ArrayList in modo da poter utilizzare una deserializzazione personalizzata. Sto cercando un modo per sovrascrivere il deserializzatore predefinito per preformare questa funzione.
Qual è la stringa originale si sta cercando di deserializzare? –
affermare che è {prodotto: "1234"} anziché {product: ["1234"]} – ltfishie
e in che modo stai tentando di deserializzarlo? puoi pubblicare del codice? –