code

왜 잭슨도 임시 멤버를 연재하는 거죠?

starcafe 2023. 3. 19. 18:23
반응형

왜 잭슨도 임시 멤버를 연재하는 거죠?

Jackson 2.1.4를 사용하여 JSON에 POJO를 serialize 하는데, 특정 필드가 serialize 되는 것은 무시하고 싶습니다.일시적 요소를 사용했지만 여전히 해당 요소를 직렬화하고 있습니다.

public class TestElement {

    int x;

    private transient String y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public String getY() {
        return y;
    }

    public void setY(String y) {
        this.y = y;
    }
}

다음과 같이 연재합니다.

public static void main(String[] args) throws JsonProcessingException {
    TestElement testElement = new TestElement();
    testElement.setX(10);
    testElement.setY("adasd");
    ObjectMapper om = new ObjectMapper();
    String serialized = om.writeValueAsString(testElement);
    System.err.println(serialized);
}

제안하지 마세요.@JsonIgnore내 모델을 잭슨 특유의 주석과 연관짓고 싶지 않기 때문이다.임시로만 할 수 있나요?오브젝트 맵퍼에 가시성 설정을 위한 API가 있습니까?

잭슨이 왜 이 영화를 연재하는지는transientmember는 멤버 자체가 아니라 getters를 사용하여 시리얼화할 대상을 결정하기 때문입니다.y공개 게터를 가지고 있고, 그게 연재됩니다.기본값을 변경하고 Jackson이 필드를 사용하도록 하려면 다음 작업을 수행하십시오.

om.setVisibilityChecker(
  om.getSerializationConfig()
    .getDefaultVisibilityChecker()
    .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
    .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
);

시리얼라이제이션 시 속성을 무시하는 또 다른 방법은 클래스에서 직접 수행하는 것입니다.

@JsonIgnoreProperties(value = { "y" })
public class TestElement {
...

또 다른 방법은 현장에서 직접 확인할 수 있습니다.

public class TestElement {

    @JsonIgnore
    private String y;
...

이게 도움이 됐으면 좋겠다.

잭슨의 시리얼화와 역직렬화를 막는 새로운 방법은mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true).

스프링 속성을 사용하여 구성할 수 있습니다.

spring.jackson.mapper.propagate-transient-marker=true

코멘트를 할 수 없기 때문에 여기서 이전 응답을 완료하고 권장되지 않는 메서드를 변경합니다.setVisibilityChecker불란에 대해 누락된 절을 추가합니다.

mapper.setVisibility(
    mapper.getSerializationConfig().
    getDefaultVisibilityChecker().
    withFieldVisibility(JsonAutoDetect.Visibility.ANY).
    withGetterVisibility(JsonAutoDetect.Visibility.NONE).
    withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
);

언급URL : https://stackoverflow.com/questions/21745593/why-jackson-is-serializing-transient-member-also

반응형