2013-01-16 3 views
7

JSON에 직렬화 할 때 객체에 새 속성을 추가해야합니다. 속성의 값은 런타임에 계산되며 객체에 존재하지 않습니다. 또한 동일한 객체를 다른 set field (다른 하위 클래스를 가진 기본 클래스를 갖는 일종의 JSON 생성을위한 인스턴스로 만들지는 않습니다)가있는 다른 JSON을 만드는 데 사용할 수 있습니다.Jackson :: 직렬화에서 객체에 추가 필드 추가

이 작업을 수행하는 가장 좋은 방법은 객체의 전체 필드 집합을 직렬화 처리하는 사용자 정의 serializer 클래스를 만드는 것이 아닙니다. 또는 일부 "기본"serializer를 상속하는 것이 가능하고 출력을 가져 와서 새 필드를 어떻게 든 추가 할 수 있습니까?

mixins에 대해 알게되었지만 일부 필드의 이름을 바꾸거나 숨길 수있는 것처럼 보였습니다. 그러나 추가 필드를 추가 할 수없는 것으로 보입니다.

답변

8

값 클래스에 메소드를 추가 할 수만 있습니까? public이거나 getter 명명 규칙을 사용할 필요는 없습니다.

JsonNode tree = mapper.valueToTree(value); 

을 다음

+0

이 것이 작업 같은 소리 같은 객체의 다른 필드를 작성하는 등. 예 : 개체의 URL ... 개체의 직업이 자신의 주소임을 아는 것이 아니라 상위 계층의 작업입니다. – cdeszaq

+0

꽤 그렇긴하지만 동일한 JSON 객체로 직렬화 된 이유는 무엇입니까? JSON 페이로드의 잠재적으로 나쁜 디자인 인 것처럼 들립니다. 부여 된 JSON은 데이터 사이에 단순한 구분이 없다는 문제가 있지만 메타 데이터 (이름 지정 규칙이 생길 수 있음) – StaxMan

+0

내부 객체 표현은 외부 리소스 표현과 동일하지 않습니다 (Accepts 헤더에 따라 변경해야 할 수도 있음) . 자원이 살아있는 URL 또는 주소는 변경 될 수 있으며 내부 객체의 책임이 아니라 라우트 또는 다른 상위 계층의 책임입니다. – cdeszaq

1

하나의 옵션은 필드를 추가하는 추가 속성 등으로 수정 : 당신이 JSON 트리 값으로 POJO를 변환 할 수 있습니다 그렇지 않으면

public class MyStuff { 
    // ... the usual fields, getters and/or setters 

    @JsonProperty("sum") // or whatever name you need in JSON 
    private int calculateSumForJSON() { 
     return 42; // calculate somehow 
    } 
} 

:처럼 당신이 뭔가를 할 수 이 속성에 대해 JSON에 쓰기 전에 개체에 설정하십시오. JSON을 쓰는 동안이 게터를

public String getFullName() { 
    return getFirstName() + " " + getLastName(); 
} 

와 일치 필드가 없다하더라도 잭슨이 자동으로 호출합니다 : 두 번째 옵션은 속성이 다른 개체 속성에서 계산 될 수 있다면 당신은 예를 들어,에 대한 게터를 추가 할 수 있습니다 JSON 출력에 fullName으로 표시됩니다. 그 세 번째 옵션이 작동하지 않을 경우지도에 개체를 변환 한 다음 필요하지만이를 조작하는 것입니다

ObjectMapper mapper //..... 
MyObject o //..... 
long specialValue //..... 
Map<String, Object> map = mapper.convertValue(o, new TypeReference<Map<String, Object>>() { }); 
map.put("specialValue", specialValue); 

당신이있는 거 문제는 비 정렬 언급하지 않았다하지만 당신은뿐만 아니라 그렇게해야하는 경우 첫 번째 옵션은 잘 작동하지만 두 번째 옵션은 약간의 조정이 필요합니다.

그리고

여분 필드의 책임을 직렬화되는 오브젝트의 일부가 아닌 경우 작동하지 않습니다 @JsonView

+0

"지도로 변환"개체는 괜찮은 것처럼 들리지만 조금 어색해 보입니다. 추가 필드가 직렬화 된 객체의 일부가 아닌 경우 "필드 추가"옵션이 작동하지 않습니다. 예 : 개체의 URL ... 개체의 직업이 자신의 주소임을 아는 것이 아니라 상위 계층의 작업입니다. – cdeszaq