2014-05-09 2 views
0

HTTP 요청 API에서 다른 유형의 JSON 응답을 받고 있습니다. 몇 가지 JSON 형식 옵션이 API에서 다시 제공 될 수 있습니다. 예를 들어 예상되는 데이터에 대해 유효한 응답 일 수 있지만 경우에 따라 내부 서버 오류 세부 메시지 일 수 있습니다.Java 처리 JSON

현재 Gson을 사용하여 들어오는 문자열을 개체로 변환하지만 때로는 Gson이 다른 템플릿 클래스로 변환 할 수없는 다른 형식으로 제공되기 때문에 제공됩니다.

참고 : 오류가 예외는 아닙니다. 예를 들어, JSON 본문에는 인증이 실패했으나 호출이 성공적으로 완료되었으며 JSON 본문이 올바른 정보 만 포함됩니다. HTTP는 실제로 항상 성공적이며 200 일 것입니다. 문제는 때때로 인증이 실패하고 다른 JSON을 반환한다는 것입니다.

String response = restTemplate.getForObject(request, String.class); 
ObjectResponse objResponse = gson.fromJson(response, ObjectResponse.class); 

다양한 유형의 응답을 처리 할 수 ​​있도록 더 나은 방법을 제안 해주세요. 아니면 완전히 다른 방법으로 알고있을 수도 있습니다.

감사합니다.

+1

HTTP 헤더에는 상태 코드가 있습니다. 그걸 사용하고 싶을 수도 있습니다 (200 = OK, 404 = 찾을 수 없음, 500 = 내부 서버 오류 등) – enlait

+0

글쎄, 당신은 항상 자바가 아닌 세상의 대부분을지도와 목록으로 해석 한 다음 결과 트리를 검사하십시오. 객체를 생성해야한다면 Map을 받아들이는 생성자를 작성하십시오. 흐름은 실제로 매우 자연 스럽습니다. –

답변

1

당신이 응답의 구조를 예측할 수없는 경우를, 간단한 Java 맵, 배열 및 문자열의 트리로 매핑하십시오. Jackson 라이브러리는 'readTree'메소드를 통해이를 지원합니다. 트리를보고 무엇이 무엇인지 결정한 후에는 트리에서 클래스의 객체에 트리를 매핑하도록 라이브러리에 요청할 수 있습니다.

+0

감사! 아마도 이것은 지금 당장 나를 위해 가장 적합 할 것입니다! –

1

하나의 옵션은 JSON 데이터를 나타내는 클래스를 만들고이를 역 직렬화하는 것입니다. 이렇게하면 데이터가 해당 구조와 일치하지 않으면 예외가 발생합니다.

개체를 만들 때 실패하면 예외를 잡아서 오류로 해독하고 해독하십시오. 그러면 원하는대로 해당 사례를 처리 할 수 ​​있습니다 (그리고 예상되는 개체가 아닌 잠재적 인 경우). 또는 유효한 오류).

+0

오류가 예외는 아닙니다. 예를 들어, JSON 본문에는 인증이 실패했으나 호출이 성공적으로 완료되었으며 JSON 본문이 올바른 정보 만 포함됩니다. –

+0

@WildGoat 사실 저는 게시물을 잘못 읽고 클래스를 JSON으로 직렬화/비 직렬화한다고 생각했습니다. 따라서 클래스와 일치하지 않는 JSON의 비 직렬화를 시도하면 예외가 발생합니다. 내 대답을 업데이트 할게. –

-1

HTTP 응답 코드를 확인하십시오. OK (200)가 아닌 상태 코드를 수신하면 성공적인 응답을 구문 분석하려고 시도하면 안됩니다. 예를 들어 당신이 코드를 확인하고이 같은 응답 (오브젝트 유형은 실제 자바 타입 아니지만, 예를 제공하기 위해 주어진다) 처리 할 수 ​​있습니다

MyHttpResponse response = MyHttpHelper.execute(...); 
int status = response.getMyStatusCode(); 
String responseData = response.getStringBody(); 
switch(status) { 
    case 200: { 
     //request is successful, parse valid data 
     break; 
    } 
    default: { 
     //request is not valid, parse error data 
     break; 
    } 
} 
+0

답장을 보내 주셔서 감사합니다.하지만 HTTP는 실제로 항상 성공적이며 200 일 것입니다. 문제는 인증이 실패 할 수 있으며 다른 JSON을 반환하는 경우가 있습니다. –

+0

너무 나쁨. 상태 코드가 항상 200이되지 않아야합니다! – binnyb