Десериализовать ArrayList из строки с помощью Jackson

Я использую Spring's 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"}

как вы можете видеть, это приведет к исключению, так как изображение ожидается массив.

Я хотел бы сделать пользовательский десериализатор, который немного более терпимым. Если десериализация завершается неудачно, создайте ArrayList одного элемента из строки. Как я могу ввести это в MappingJacksonHttpMessageConverter или ObjectMapper?

Я не хочу использовать аннотацию для пометки каждого поля ArrayList, чтобы можно было использовать пользовательскую десериализацию. я ищу способ, чтобы перезаписать десериализатор по умолчанию предварительно сформируйте эту функцию.

2 ответов


ознакомьтесь с этой статьей, описывающей, как использовать функции jackson objectMapper для этого.

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

для меня добавление следующего решило эту проблему

jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

насколько я вижу, входящий 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;
   }
}