2016-08-02 4 views
2

나는 JSON으로 내 POJO를 변환 잭슨 JSON 라이브러리를 사용하고 있습니다 :직렬화 중첩 된 객체 JSON 잭슨

public class A { 
     public String name; 
     public B b; 
    } 

    public class B { 
     public Object representation; 
     public String bar; 
    } 

내가 JSON에 A의 인스턴스를 직렬화합니다. 나는 Jackson에서 ObjectMapper 클래스를 사용하기 위하여려고하고있다 :

예 : @XmlRootElement@XmlType 같은 주석이 모든 있습니다 JAXB 클래스로 루트 요소를 선택합니다 인트로 스페

다음
objectMapperPropertiesBuilder.setSerializationFeature(SerializationFeature.WRAP_ROOT_VALUE); 
objectMapperPropertiesBuilder.setAnnotationIntrospector(new CustomAnnotionIntrospector()); 

주석을 내가 Object에 설정 한 경우 표현 :

public class C { 
     public BigInteger ste; 
     public String cr; 
    } 

이 코드를 사용하여 내 JSON은 다음과 같이 보일 것이다 :

rootA: { 
    "name": "MyExample", 
    "b": { 
    "rep": { 
     "ste": 7, 
     "cr": "C1" 
    }, 
    "bar": "something" 
    } 
} 

하지만 중첩 된 Object에도 루트 요소를 추가하고 싶습니다. Object는 임의의 사용자 정의 POJO가 될 수 있습니다.

그래서이 경우에는 JSON 변환에 C 클래스의 루트 요소를 추가하고 싶습니다. 따라서 :

rootA: { 
    "name": "MyExample", 
    "b": { 
    "rep": { 
     "rootC": { 
     "ste": 7, 
     "cr": "C1" 
     } 
    }, 
    "bar": "something" 
    } 
} 

어떻게 중첩 된 객체의 루트 요소를 JSON 변환에 추가 할 수 있습니까? 지정한 objectMapper 속성은 모두 class A에 적용됩니다. 중첩 된 객체에 일부 속성을 적용하기 위해 사용자 정의 직렬 변환기를 작성해야합니까?

+0

질문에 입력 한 JSON이 유효하지 않습니다. 당신은 그들 [여기] (http://jsonlint.com/)을 확인할 수 있습니다. –

답변

1

사용자 정의 직렬 변환기를 사용할 수 있습니다.

@JsonRootName(value = "rootA") 
public class A { 
    public String name; 
    public B b; 
} 
public class B { 
    @JsonProperty("rep") 
    public Object representation; 
    public String bar; 
} 
public class C { 
    public BigInteger ste; 
    public String cr; 
} 

코드 작성 : 같은

Map<String, Object> map = new HashMap<>(); 
map.put("rootC", c); 

수업은 다음과 같습니다 그러나, 가장 쉬운 방법은 C 인스턴스를 래핑하는 것을 당신이 Map을 사용하고 싶은 달성하기 위해 JSON은 다음과 같습니다.

A a = new A(); 
a.name = "MyExample"; 

B b = new B(); 
b.bar = "something"; 

C c = new C(); 
c.cr = "C1"; 
c.ste = new BigInteger("7"); 

a.b = b; 

Map<String, Object> map = new HashMap<>(); 
map.put("rootC", c); 
b.representation = map; 

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
mapper.enable(SerializationFeature.INDENT_OUTPUT); 

String json = mapper.writeValueAsString(a); 

생성 된 JSON은 다음과 같습니다.

{ 
    "rootA" : { 
    "name" : "MyExample", 
    "b" : { 
     "rep" : { 
     "rootC" : { 
      "ste" : 7, 
      "cr" : "C1" 
     } 
     }, 
     "bar" : "something" 
    } 
    } 
} 
+0

이 작동하지만 입력을 내 손에 설정되지 않습니다. 나는 객체를 채우고 직렬화해야하므로'Map'을 설정하는 것이 아닙니다 (클라이언트가 그렇게 함). 그래서 커스텀 시리얼 라이저를 사용해야합니까? –

+0

그리고 커스텀 시리얼 라이저를 사용한다면, 커스텀 방식을 사용하여'representation' 부분을 직렬화하고 나머지는 모든 루트 (Row) 클래스에 설정된'ObjectMapper' 속성을 사용하여 모든 속성을 직렬화 할 수 있습니다. 그게 어떻게 성취 될 수 있니? –

+0

또한 내 POJO도 주석을 편집 할 수 없습니다. 'ObjectMapper'를 사용해야 할 것입니다. –