2017-02-24 57 views
1

@JsonProperty를 동적으로 설정하거나 호출시 설정할 수 있습니까?JsonProperty 필수 값을 조건부로 사용할 수 있습니까?

이 뒤에 그 이유 ... 나는 스키마를 설명하고 정의하는 JSON 파일을 생성하고있어

  • 새로운 항목에 대한 필수 필드가
  • 필수 무엇 무엇 업데이트에 대한 항목입니다.

그래서 창조는 foo는

필요하며, 업데이트가 foo는 내가 지금 필요한 말을 뭔가를 통과 할 수 있도록

내가 일을 할 수있는 바이 필요?

또는 JsonProperty에 다른 설정을하려면이 코드를 복제해야합니까?

@JsonInclude(Include.NON_NULL) 

public class Bean { 

    @JsonProperty(value="foo", required=false) 
    private FooProperty fooProperty; 

    @JsonProperty(value="bar", required=false) 
    private BarProperty barProperty; 

    // 
    public FooProperty getFooProperty() { return fooProperty; } 

    public void setFooProperty(FooProperty argFooProperty) { 
     this.fooProperty = argFooProperty 
    } 


    public BarProperty getBarProperty() { return barProperty; } 

    public void setFooProperty(BarProperty argBarProperty) { 
     this.barProperty = argBarProperty 
    } 
} 
+0

조금 정교하게 사례를 설명 할 수 있습니까? – Coder

+0

자세한 내용을 추가했습니다. – Elijah

+0

은 직렬화/직렬화를위한 것입니까?커스텀 시리얼 라이저를 보셨습니까? '@JsonAnyGetter'와'@JsonAnySetter'를 사용할 수있는 옵션을 사용하고 있습니까? – Coder

답변

1

몇 가지 방법으로이 문제를 해결할 수 있습니다. 첫 번째는 Franjavi으로 믹스 인을 사용할 수 있다고 제안했습니다.

foo을 무시 속성 중 하나로 표시하는 믹스 인 클래스가 있습니다. 주류 계급에서 필요한 악마를 표시하고 이것이 옵션 필드 일 때마다이 mixin을 주입 할 수 있습니다.

@JsonIgnoreProperties("foo") 
public abstract class mixinClass { 

} 

다음과 같이 믹서를 구성하십시오.

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixInAnnotations(Bean.class, mixinClass.class); 

이 항상 당신이/직렬화 Resttemplate처럼 그들에 의해 제공되는 기본 잭슨 매퍼를 사용하여 역 직렬화 할 수있는 타사 API에서이 반응을 얻고 때마다 작업 옵션이 아닙니다.

이 경우 foo 속성 대신 모든 응답에있는 속성을 모두 포함하고 @JsonAnyGetter@JsonAnySetter을 사용하여 나머지 속성을 처리 할 수 ​​있습니다. 이 경우 foo 인 키를 오브젝트 이름으로 사용하여 맵에서이를 캡처 할 수 있습니다. 상위 노드 나 다음 선택적 속성을 캡슐화 할 노드에서 다음 부분을 가져야합니다.

@JsonIgnore 
private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

@JsonAnyGetter 
public Map<String, Object> getAdditionalProperties() { 
return this.additionalProperties; 
} 

@JsonAnySetter 
public void setAdditionalProperty(String name, Object value) { 
this.additionalProperties.put(name, value); 
} 

추가 설명이 필요하면 알려주세요.

+0

이것을 분명히하십시오. mixinClass를 확장하기 위해 Bean 클래스를 사용 하겠지만 ObjectMapper 코드는 어디에 두어야합니까? – Elijah

+1

ObjectMapper은/역 직렬화 당신을위한 내용을 직렬화하는 것입니다 파일로 이동합니다. POJO에 있지 않습니다. – Coder

+0

더 읽기 '@JsonProperty (value = "foo", required = false)'는 기본적으로 false이고, JsonIgnoreProperties를 사용하면 false로 남겨져서 순서대로 모든 POJO를 변경해야합니다. true로 설정 한 다음 JsonIgnoreProperties를 사용하여 값을 변경하십시오. ?이 정확 ............... 그리고 그 경우는 다음의 경우 우리가 POJO를 수백이 있고 욕망이 갈 필요가 없습니다 것입니다으로이 문제를 접근하는 방법에 대한 다른 제안 그들 모두를 변경하십시오. – Elijah

1
당신은 유지 mixin 사랑의 재생할 수 있습니다

과 매퍼 :

public interface BarRequiredMixIn { 
    @JsonProperty(value="bar", required=true) 
    private BarProperty barProperty; 
} 

ObjectMapper mapper = new ObjectMapper(); 
// When you want that it is required 
mapper.addMixInAnnotations(Bean.class, BarRequiredMixIn.class); 

그러나 나는 강하게은 그것을 위해 설계되지 않기 때문에, 잭슨 조건부 제한의이 종류를 사용하지 않도록하는 것이 좋습니다, 그것은 보인다 일종의 혼란.

+0

맨발로. 그래서 Bean에 인터페이스를 구현하고 Bean 클래스에 ObjectMapper 코드를 추가합니까? ObjectMapper 코드가 어디로 가야하는지 또는 Bean 클래스의 기본값을 변경할 수 있도록 적용하는 방법에 대해서는 명확하지 않습니다. – Elijah