6

Spring の MappingJacksonHttpMessageConverter を使用して、コントローラーで JSON メッセージをオブジェクトに変換しています。

<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 フィールドをマークするつもりはありません。 この関数を実行するためにデフォルトのデシリアライザーを上書きする方法を探しています。

4

2 に答える 2

14

これを実現するためにjacksonobjectMapperの機能を使用する方法を説明しているこの記事を確認してください。

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

私にとって、以下を追加すると、この問題は解決しました

jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
于 2012-10-03T20:32:00.927 に答える
2

私が見る限り、着信 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;
   }
}
于 2012-04-20T17:48:12.603 に答える