복붙노트

[SPRING] Jackson은 비어있는 목록으로 비 직렬화 ""합니다.

SPRING

Jackson은 비어있는 목록으로 비 직렬화 ""합니다.

빈 목록을 [] 대신 ""으로 표시하는 JSON 문자열이 있습니다. 예를 들어, 자식이없는 객체가있는 경우 다음과 같은 문자열이 표시됩니다.

{"id":13, "children":""}

부모 클래스에 deserialize하고 싶습니다. 아이들은 빈 아이들리스트에 제대로 설정되어 있습니다.

public class Parent {

    private Long id;
    private List<Child> children;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public List<Child> getChildren() {
        return children;
    }

    public void setChildren(List<Child> children) {
        this.children = children;
    }
}

위의 JSON 문자열의 경우 id를 13으로 설정하고 자식을 새 ArrayList ()로 설정하는 객체를 원합니다.

Parent
    id <- 13
    children <- new ArrayList<Child>()

전체 클래스에 대해 특수 효과를 사용하는 방법을 알고 싶습니다.

@JsonDeserialize(using = ParentDeserializer.class)
public class Parent { 
    ...
}

그리고

public class ParentDeserializer extends JsonDeserializer<Parent> {
    public Parent deserialize(JsonParser parser, DeserializationContext context) {
        ...    
    }
}

그러나 목록에서 제대로 인스턴스화하는 일반적인 문제를 해결하고 싶습니다.

public class Parent {
    ...
    // Can I get something like this?
    @JsonDeserialize(using = EmptyArrayDeserializer<Child>.class) 
    public void setChildren(List<Child> children) {
        this.children = children;
    }
}

나는 그런 것을 얻을 수 있습니까?

해결법

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

    1.몇 가지 옵션; 먼저,`ACCEPT_EMPTY_STRING_AS_NULL_OBJECT '를 유효하게하고 싶다 :

    몇 가지 옵션; 먼저,`ACCEPT_EMPTY_STRING_AS_NULL_OBJECT '를 유효하게하고 싶다 :

    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
    

    빈 문자열은 null이됩니다. 그리고 만약 당신이 그것을 실제 빈리스트로 바꾸고 싶다면, setter를 재정의하십시오 :

    public void setChildren(List<Child> c) {
        if (c == null) {
           children = Collections.emptyList();
        } else {
           chidlren = c;
        }
    }
    
  2. from https://stackoverflow.com/questions/12933394/jackson-deserialize-as-an-empty-list by cc-by-sa and MIT license