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 消息中包含 String,则会抛出以下异常:

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 字段,以便可以使用自定义反序列化。 我正在寻找一种方法来覆盖默认反序列化器以执行此功能。

4

2 回答 2

14

查看这篇文章,描述如何使用 jackson objectMapper 的功能来完成此操作。

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