私は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フィールドに注釈を付けることを検討していません。 私は、この機能を実行するためにデフォルトのデシリアライザを上書きする方法を探しています。
あなたがデシリアライズしようとしている元の文字列がどのようなものですが解決以下を加えますか? –
{product:["1234"]} – ltfishie
の代わりに{product: "1234"}と書かれていますが、どのようにデシリアライズしようとしていますか?いくつかのコードを投稿できますか? –