我使用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"}
如您所见,这将产生异常,因为图像应该是一个数组。
我想制作一个更宽容的自定义反序列化器。如果反序列化失败,请从String中创建单个元素的ArrayList。我如何将其注入MappingJacksonHttpMessageConverter或ObjectMapper?
我不打算使用注释来标记每个ArrayList字段,因此可以使用自定义反序列化。 我正在寻找一种方法来覆盖默认的反序列化程序以执行此功能。
答案 0 :(得分:14)
查看这篇文章,描述如何使用jackson objectMapper的功能来完成此任务。
https://github.com/FasterXML/jackson-dataformat-xml/issues/21
对我来说,添加以下内容解决了这个问题
jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
答案 1 :(得分: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;
}
}