2012-04-20 23 views
6

Denetleyicimde nesneye JSON mesajını dönüştürmek için Spring'in MappingJacksonHttpMessageConverter kullanıyorum. json mesajı yerine bir dize içeriyorsaArrayList, String kullanarak String from Stringer

ArrayList olarak ilan edilir alanlar için
<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> 

, şu istisna atılır:

:

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

örneği aşağıdaki sınıf tanımı olurdu

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

gelen Json nerede:

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

Gördüğünüz gibi, görüntünün bir dizi olması beklenen bu durum istisnayı oluşturacaktır.

Biraz daha toleranslı olan özel bir serpanteyici yapmak isterim. Deserialization başarısız olursa, String'den tek bir elemanın bir ArrayList oluşturun. Bunu MappingJacksonHttpMessageConverter veya ObjectMapper uygulamasına nasıl enjekte edebilirim?

Her ArrayList alanını işaretlemek için ek açıklama kullanmak istemiyorum, böylece özel bir seri hale getirme kullanılabilir. Bu işlevi önceden oluşturmak için varsayılan serpantinin üstüne yazmanın bir yolunu arıyorum.

+0

sen serisini çalışıyoruz orijinal dizesi nedir çözüldü Aşağıdaki eklenmesi? –

+0

, {product: ["1234"]} – ltfishie

+0

yerine {product: "1234"} olduğunu ve nasıl seri hale getirmeye çalıştığınızı söyleyin? bazı kod gönderebilir misin? –

cevap

14

Kontrol dışarı Bunu gerçekleştirmek için jackson objectMapper özelliklerini nasıl kullanılacağını açıklayan bu yazıyı. Benim için

https://github.com/FasterXML/jackson-dataformat-xml/issues/21

bu sorunu

jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); 
+4

veya sürüm 2 jsonMapper.configure (DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); –

+3

İsa, neden çevrimiçi bulmak bu kadar zordu? * Bu * aradığım çözümdür - teşekkür ederim. – Ryan

1

Gelen JSON'un görmediği kadarıyla herhangi bir dizi içermiyor. Soru şudur: "görüntüler" ayrılması mı gerekiyor yoksa tek bir görüntü mü var? Hadi onlar virgül ile ayrılarak varsayalım:

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

    @JsonProperty("images") 
    public String getImagesAsString() { 
     StringBuilder sb = new StringBuilder(); 
     for (String img : images) { 
      if (sb.length() > 0) sb.append(','); 
      sb.append(img); 
     } 
     return sb.toString(); 
    } 

    public void setImagesAsString(String img) { 
     this.images = Arrays.asList(img.split(",")); 
    } 

    @JsonIgnore 
    public List<String> getImages() { 
     return images; 
    } 
} 
+0

Cevabınız için teşekkürler. Özür dilemediğim için üzgünüm, ama yapmaya çalıştığım şey biraz daha hoşgörülü olmaktır. Ayrıca bunu varsayılan ayrıştırma davranışına uygulamak istiyorum, bu yüzden ek açıklamaları kullanmam veya her alan için ikinci bir ayar yöntemi oluşturmama gerek yok. – ltfishie

+0

Diğer seçenek, "görüntüler" alanının düz bir dize olmasını (tek bir görüntü içeriyorsa) ya da bir dize yerine bir dizi göndermek için JSON dizesinin biçimini değiştirmektir. –

İlgili konular