2012-04-20 7 views
6

Jackson은 메서드 기반의 serialization을 수행한다고 생각합니다. 필드 기반으로 만들 수있는 방법이 있습니까?Jackson 필드 기반 직렬화

예 :

class Bean { 
    Integer i; 
    String s; 

    public Integer getI() { return this.i; } 
    public void setI(Integer i) { this.i = i; } 
    public bool isSetI() { return this.i != null; } 

    // same for s as well 
} 

출력 JSON은 "I"및 "세티"를 갖는다. 어쨌든 "i"만 얻으려면 이것을 무시할 수 있습니까? 클래스에 주석을 추가하지 않고도이 작업을 수행 할 수있는 방법이 있다면 (자동 생성됩니다) 또한 좋을 것입니다.

+1

이 코드는 컴파일되지 않습니다. 직렬화하려는 방법과 함께 사용중인 실제 코드를 게시 할 수 있습니까? –

답변

5

는 다음과 같은 방식으로/역 직렬화를 직렬화하기 전에 ObjectMapper를 구성 할 수 있습니다 주석없이이 작업을 수행하려면

ObjectMapper om = new ObjectMapper(); 
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker(). 
      withGetterVisibility(JsonAutoDetect.Visibility.NONE). 
      withSetterVisibility(JsonAutoDetect.Visibility.NONE)); 
6

Jackson도 필드를 사용할 수 있습니다. 예; 기본적으로 공개 입력란 만 검색됩니다. 그러나 @JsonProperty을 사용하여 비공개 필드를 표시 할 수 있습니다.

한 가지주의해야 할 점은 메서드 (setX, getX)와 필드 (x)가 모두 있으면 메서드가 우선한다는 것입니다. 이것은 일반적으로 문제가 아니지만 그렇다면 명시 적으로 사용하지 않을 방법을 사용하지 말고 @JsonIgnore enxt를 추가해야합니다.

10

@JsonAutoDetect 주석을 확인하십시오. 예 :

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE) 
public class Bean { 
    Integer i; 
    String s; 

    Integer getI() { return this.i; } 
    void setI(Integer i) { this.i = i; } 
    bool isSetI() return { this.i == null; } 

    // same for s as well 
} 
3

허용 된 대답은 나를 위해 예상 된 결과를 생성하지 않았다. 무엇은 다음과 같은 방법으로 ObjectMapper를 구성 주석을 추가하지 않고 나를 위해 작동 :이 게터 \ 표준 자바 직렬화와 같은 세터 대신 필드를 사용하는 나에게 많은 의미를 보인다 방식이다

ObjectMapper om = new ObjectMapper() 
     .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) 
     .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

것 해야 할 것.

관련 문제