2012-04-20 58 views
6

我使用Spring的MappingJacksonHttpMessageConverter將JSON消息轉換爲我的控制器中的對象。從串反序列化ArrayList使用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> 

對於被聲明爲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"} 

正如你所看到的,這將產生異常,因爲圖像應該是一個數組。

我想製作一個更耐用的自定義解串器。如果反序列化失敗,請從String中創建一個單個元素的ArrayList。我將如何去注入MappingJacksonHttpMessageConverter或ObjectMapper?

我不想使用註釋來標記每個ArrayList字段,因此可以使用自定義的反序列化。 我正在尋找一種方法來覆蓋默認的解串器來執行此功能。

+0

什麼是你試圖反序列化原始字符串? – 2012-04-20 14:46:12

+0

說它是{產品:「1234」}而不是{產品:[「1234」]} – ltfishie 2012-04-20 15:06:33

+0

,你是如何試圖反序列化它?你可以發佈一些代碼嗎? – 2012-04-20 15:10:42

回答

14

查看本文描述如何使用jackson objectMapper的功能來完成此操作。

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

對我來說,加入以下解決了這個問題

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

或版本2 jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,true); – 2013-02-03 08:37:38

+3

基督,爲什麼這麼難在網上找到? *這是我一直在尋找的解決方案 - 謝謝。 – Ryan 2014-06-05 06:51:44

1

據我看到傳入的JSON不包含任何數組。問題是:「圖像」應該是分離的還是包含單個圖像?我們假設它們是逗號分隔的:

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

謝謝你的回答。對不起,如果我沒有說清楚,但我想要做的是使解析更寬容一點。我也想把它應用到默認的解析行爲,所以我不需要使用註釋或爲每個字段創建第二個setter方法。 – ltfishie 2012-04-23 14:41:17

+0

另一種選擇是將圖像字段設置爲純字符串(如果它包含單個圖像),或者更改JSON字符串的格式以發送數組而不是字符串。 – 2012-04-23 17:14:19