2013-02-03 2 views
0

webservice는 NULL 대신 빈 문자열을 반환하므로 Jackson이 충돌합니다. 그래서 사용자 정의 파서를 만들었고 수동으로 구문 분석하려고합니다. 어떤 생각 어떻게 이걸 얻을 수 있니?RestTemplate & Jackson - 사용자 정의 JSON 비 직렬화?

무엇이 잘못 되었나요? 내가하려는 것은 JSON을 구문 분석하여 내가 일반적으로하는 것처럼 처리하는 것이다. 필드 이름은 @JsonProperty를 사용하여 내 속성에 추가되므로 파서는이를 변환하는 방법을 알아야합니다. 여기

public class InsertReplyDeserializer extends JsonDeserializer<ListingReply> { 

    @Override 
    public ListingReply deserialize(JsonParser jsonParser, DeserializationContext arg1) 
      throws IOException, JsonProcessingException { 

     ObjectCodec oc = jsonParser.getCodec(); 
     JsonNode node = oc.readTree(jsonParser); 

     // If service returns "" instead of null return a NULL object and don't try to parse 
     if (node.getValueAsText() == "") 
      return null; 


     ObjectMapper objectMapper = new ObjectMapper(); 
     ListingReply listingReply = objectMapper.readValue(node, ListingReply.class); 


     return listingReply; 
    } 

} 

답변

0

내가 그것을

@Override 
public MyObject deserialize(JsonParser jsonParser, DeserializationContext arg1) 
     throws IOException, JsonProcessingException { 

    ObjectCodec oc = jsonParser.getCodec(); 
    JsonNode node = oc.readTree(jsonParser); 

    if (node.getValueAsText() == "") 
     return null; 

    MyObject myObject = new MyObject(); 
    myObject.setMyStirng(node.get("myString").getTextValue()); 

    JsonNode childNode = node.get("childObject"); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    ChildObject childObject = objectMapper.readValue(childNode, 
      ChildObject.class); 

      myObject.setChildObject(childObject); 
      return myObject; 
} 
0

난 당신이 수동으로 응답을 구문 분석 할 필요가 확실하지 않다 해결 방법이다. 당신의 솔루션은 작동 할 것이지만 제 생각에는 차선책으로 보입니다. RestTemplate을 사용하고있는 것처럼 보이므로 독자가 작성한 메시지 변환기를 작성 (또는 파서 코드를 이동)해야합니다. 그런 다음이 변환기를 나머지 템플릿 개체에 추가하면 내부적으로 값이 deserialize됩니다. 내가 역 직렬화에 대해 아무것도 할 필요가 없습니다 대부분의 경우 라인을 따라 뭔가,

public class CustomHttpmsgConverter extends AbstractHttpMessageConverter<Object> { 
private ObjectMapper objectMapper = new ObjectMapper(); 
@Override 
protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
    InputStream istream = inputMessage.getBody(); 
    String responseString = IOUtils.toString(istream); 
    if(responseString.isEmpty()) //if your response is empty 
    return null; 
    JavaType javaType = getJavaType(clazz); 
    try { 
     return this.objectMapper.readValue(responseString, javaType); 
    } catch (Exception ex) { 
    throw new HttpMessageNotReadableException(responseString); 
    } 
} 

//add this converter to your resttemplate 
    RestTemplate template = new RestTemplate(); 
    List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); 
    converters.add(new CustomHttpmsgConverter()); 
    template.setMessageConverters(converters); 
+0

, 이것은 나쁜 데이터를 파싱 충돌 서버에서 제공되는 특별한 경우이다 파서 객체 구조를 기대하고 있기 때문에 응답은 빈 문자열 (결과의 특정 필드에 대한)입니다. 그래서 이것은 내 애플 리케이션에있는 모델 중 단 하나 deserializing에 대한 해결 방법입니다. 나머지 애플 리케이션에서는 JSON을 deserialize 할 필요가 없습니다. RestTemplate & Jackson (@JsonProperty 주석 사용하기)에 의해 자동화되었습니다. – aryaxt

+0

정확히, 그래서 위의 내 솔루션은 수동으로 deserialization 제거 빈 응답 문자열을 돌볼 것입니다이 특수 변환기를 나머지 템플릿을 추가 할 제안합니다. 이 같은 – nilesh

+0

Ooooh와 같은 상황을 정확히 처리하기 위해 변환기가 제공되므로 단일 클래스 직렬화 해제시 오류를 처리하는 대신 MessageConverter로 옮겨 모든 것을 적용합니다. 나는 그것을 시도하고 다시 게시 할 것입니다 – aryaxt