2012-04-20 8 views
6

私はSpringのMappingJacksonHttpMessageConverterを使用して、JSONメッセージをコントローラ内のオブジェクトに変換しています。 ArrayListのように宣言されているフィールドについてJacksonを使用してStringからArrayListを非直列化する

<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> 

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"} 

ご覧のとおり、imageは配列であると予想されるため、例外が発生します。

私は少し寛容なカスタムデシリアライザを作りたいと思います。逆シリアル化が失敗した場合は、Stringから単一要素のArrayListを作成します。これをMappingJacksonHttpMessageConverterまたはObjectMapperにどのように注入するのですか?

カスタムの直列化を使用できるように、各ArrayListフィールドに注釈を付けることを検討していません。 私は、この機能を実行するためにデフォルトのデシリアライザを上書きする方法を探しています。

+0

あなたがデシリアライズしようとしている元の文字列がどのようなものですが解決以下を加えますか? –

+0

{product:["1234"]} – ltfishie

+0

の代わりに{product: "1234"}と書かれていますが、どのようにデシリアライズしようとしていますか?いくつかのコードを投稿できますか? –

答えて

14

は、これを達成するためにジャクソン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); –

+3

キリストはなぜこれをオンラインで見つけるのが難しいのですか? *これは私が探している解決策です - ありがとうございます。 – Ryan

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

お返事ありがとうございます。申し訳ありませんが、私はそれを明確にしませんでしたが、私がしようとしているのは、少し寛容な構文解析を行うことです。また、これをデフォルトの解析動作に適用したいので、注釈を使用する必要はなく、すべてのフィールドに2番目のセッターメソッドを作成する必要はありません。 – ltfishie

+0

もう一つのオプションは 'images'フィールドをプレーンな文字列(単一のイメージを含む場合)にするか、文字列の代わりに配列を送るようにJSON文字列のフォーマットを変更することです。 –

関連する問題