2014-02-13 2 views
16

Jackson 2.1.4를 사용하여 POJO를 JSON으로 직렬화하고 있지만 특정 필드를 직렬화하는 것을 무시하고 싶습니다. 나는 일시적으로 사용했지만 여전히 그 요소를 직렬화하고있다.왜 jackson이 일시적인 멤버도 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을 제안하지 마십시오. 그것은 과도 사용만으로 끝날 수 있습니까? 가시성 설정을위한 objectmapper에 API가 있습니까?

답변

28

잭슨이 transient 멤버를 serialize하는 이유는 getter가 멤버 자체가 아닌 serialize 할 대상을 결정하기 때문입니다. y에는 공개 getter가 있기 때문에 직렬화됩니다. 당신이 그 기본을 변경하려면 잭슨 사용 필드가있는 경우 - 간단하게 수행

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

그리고 또 다른 :

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

직렬화의 속성을 무시하는 또 다른 방법은 클래스에 직접하는 것입니다 방법은 직접 필드에 있습니다 :

public class TestElement { 

    @JsonIgnore 
    private String y; 
... 

희망이 도움이됩니다.

+1

내가이 질문에서 언급했듯이, 나는 내 모델을 잭슨 특정 주석에 묶을 필요가없는 방법을 선호한다. 내가 이해할 수없는 한 가지는 왜 잭슨이 과도기적 인 멤버를 연재하는지 아닌가? Smart API 나 java serializer와 같은 다른 API는 그렇게하지 않습니다. 이것에 대한 어떤 생각? – Naman

+1

원래의 답변을 업데이트하여 문제를 자세히 설명하고 해결 방법을 제공합니다. 도움이되기를 바랍니다. – Eugen

+0

고마워, 나는 첫 번째 해결책을 찾고 있었다. 이제 모든 잭슨 특수 주석을 사용하지 않고도이 작업을 수행 할 수 있습니다. – Naman

2
내가 코멘트 그래서 (지금)되지 않는 방법 setVisibilityChecker를 변경하고 논리 값에 대한 누락 된 절을 추가, 여기에 이전 응답을 완료 할 수 없습니다

:

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

직렬화 및 역 직렬화에서 잭슨을 중지하는 새로운 방법을 mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)으로 전화하는 것입니다.