복붙노트

[SPRING] Jackson을 사용하여 String에서 ArrayList를 deserialize합니다.

SPRING

Jackson을 사용하여 String에서 ArrayList를 deserialize합니다.

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이 포함되어 있으면 다음 예외가 throw됩니다.

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 필드를 표시하지 않으므로 사용자 지정 deserialize를 사용할 수 있습니다. 이 기능을 수행하기 위해 기본 디시리얼라이저를 덮어 쓰는 방법을 찾고 있습니다.

해결법

  1. ==============================

    1.Jackson objectMapper의 기능을 사용하여이를 수행하는 방법을 설명하는이 기사를 확인하십시오.

    Jackson objectMapper의 기능을 사용하여이를 수행하는 방법을 설명하는이 기사를 확인하십시오.

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

    나를 위해 다음 문제를 해결하면이 문제가 해결됩니다.

    jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    
  2. ==============================

    2.늘어나는만큼 내가 들어오는 JSON 어떤 배열을 포함하지 않습니다. 질문 : "이미지"가 분리되어 있어야하나요? 아니면 하나의 이미지가 포함되어 있습니까? 쉼표로 구분되어 있다고 가정 해 보겠습니다.

    늘어나는만큼 내가 들어오는 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;
       }
    }
    
  3. from https://stackoverflow.com/questions/10247639/deserialize-arraylist-from-string-using-jackson by cc-by-sa and MIT license