2014-09-14 3 views
0

Ember를 사용하여 클라이언트 응용 프로그램을 만들고 백엔드는 Java Servlet이며 Jackson을 사용하여 호출을 처리합니다.Jackson을 사용하여 Ember JSON API 요청을 처리합니다.

내가 잭슨

mapper.readValue(jsonData, Customer.class); 

에서 간단한 솔루션을 사용할 수없는 형식으로 JSON 데이터와

{ 
    "customer":{ 
     "name":"4545", 
     "email":"454545", 
     "authenticator":"facebook" 
    } 
} 

고객 필드에없는 것처럼 :

타다 남은에서 고객의 전화를 만들 수는 다음과 같습니다 JSON 데이터의 첫 번째 레벨 나는 고객 필드를 얻을 수있는 JSON 데이터를 처리했고, 다음과 같이 구현 :

JsonNode rootNode = mapper.readTree(jsonData); 
Iterator iterator = rootNode.fields(); 
Entry first = (Entry) iterator.next(); 
ObjectNode node = (ObjectNode) first.getValue(); 
mapper.readValue(node.toString(), Customer.class); 

하지만 잭슨의 상자 밖으로, 또는 무언가를 할 수있는 더 좋은 방법을 찾고 있어요. 어떤 제안?

답변

3

DeserializationConfig.UNWRAP_ROOT_VALUE 속성을 (이 기능은 1.9.0 및 이후 버전에 포함되어있다)를 사용하여 내부 데이터를 customer 필드를 무시하고 처리 할 첫 번째 레벨의 데이터를 무시하려고하면 "허용

기능 직렬화에 사용되는 SerializationConfig.Feature.WRAP_ROOT_VALUE 설정과 일치하도록 "래핑 해제"루트 수준 JSON 값을 반환합니다. 루트 JSON 값이 JSON 객체이고 루트 이름이 예상되는 단일 속성이 있는지 확인합니다. 그렇지 않은 경우, JsonMappingException가 Throw됩니다. 그렇지 않으면 래핑 된 속성의 값은 마치 루트 값인 것처럼 직렬화 해제됩니다.

이것은 당신의 매퍼를 하나 추가 명령을 구성하려면이 포함됩니다 :

mapper.configure(SerializationConfig.Feature.UNWRAP_ROOT_VALUE, true); 
try 
{ 
    Customer customer = mapper.readValue(jsonData, Customer.class); 
} 
catch (IOException ioe) 
{ 
    //... 
} 
잭슨과 일치 할 수 있도록 이미 추가하지 않을 경우 귀하의 모델 클래스의 루트 요소 이름을 추가하는 것이 필요할 수 있습니다

비 직렬화시 JSON 피드의 루트 수준 이름 :

@JsonRootName("customer") 
public class Customer { 
//... 
} 
+0

고마워요! mapper.configure (SerializationFeature.WRAP_ROOT_VALUE, true)도 사용됩니다. –

+1

물론 직렬화 스타일은 직렬화 된 직렬화 스타일과 결합해야합니다.하지만 OP에서 그 문제를 해결하지 못했기 때문에 주요 문제를 납치하고 싶지 않았습니다. :) – tmarwen