2017-01-14 1 views
8

간단한 JSON 응답을 읽으려고합니다.Gson : 문자열이 있어야하지만 BEGIN_OBJECT가되었습니다.

{ "response": "ok" }

여기 내 코드입니다 :

JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8")); 
     String response = null; 
     boolean success = false; 

     reader.beginObject(); 
     if (reader.hasNext()) 
     { 
      String token = reader.nextName(); 

      if (token.equals("response")) { 
       response = reader.nextString(); 
      } 
      else { 
       reader.skipValue(); 
      } 
     } 
     reader.endObject(); 
     reader.close(); 

그러나 나는이 오류가 무엇입니까 :

Expected a string but was BEGIN_OBJECT

가 내가 뭘 잘못 이해하지 못하고 있습니다. 너 나 좀 도와 줄 수있어?

+0

이런 식으로'gson' 라이브러리를 사용할 것을 강력히 권장합니다 .... 상용구의 톤을 제거하고 오류가 발생하기 쉬운 것을 제거합니다. –

+0

JsonReader는 gson 라이브러리 – student

+0

https://github.com/google/gson .....에 있습니다. 특히 사용자 정의 코드를 사용하지 않고 Java POJO를 json으로 /부터 매핑 할 수 있습니다. –

답변

4

파서 입니다. 제공 한 코드 스 니펫이 실제로 예외 스택 추적에 속하는 경우 파싱하려는 JSON의 response 속성에 문자열이 아닌 다른 값이 있다고 생각합니다. 예를 들어,

{ "response": "ok" } 

은 파서로 잘 분석 할 수 있습니다. 또한

Exception in thread "main" java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 16 path $.response

같은 실패한다

{ "response": {"status": "ok"} } 

가 GSON가 문제가있는 위치에서보고 참고 : 그러나 당신이 당신의 파서 얻을 수있는 가장 가까운 예외 메시지는 JSON은 아래와 비슷합니다 적어도 최신 버전에서는 (나는 Gson 2.5로 테스트했다.) 예상되는 입력을 받고 있는지 확인하십시오. 응답이 위에서 언급 한 형식이어야한다고 생각되면 입력 스트림을 추적하여 차이점을 찾으십시오. 간단한하지만 가장 효율적인 구현에 입력 스트림을 추적하고,이 같은 조금 더 효율적으로 추적 독자 수 :

private static Reader traceReader(final Reader reader) { 
    return new Reader() { 
     @Override 
     public int read(final char[] buffer, final int offset, final int length) 
       throws IOException { 
      final int read = reader.read(buffer, offset, length); 
      if (read != -1) { 
       // or any other appropriate tracing output here 
       out.print(new String(buffer, offset, read)); 
       out.flush(); 
      } 
      return read; 
     } 

     @Override 
     public void close() 
       throws IOException { 
      reader.close(); 
     } 
    }; 
} 

과 :

JsonReader reader = new JsonReader(traceReader(new InputStreamReader(in, "UTF-8"))) 

그런 다음 당신 경우 다시 확인 을 정말 { "response": "ok" } 이군요.

+0

답해 주셔서 감사합니다. 저는 우편 배달부와의 응답을 확인했으며 이것이 제가 처음에 게시 한 응답임을 확인할 수 있습니다. – student

+0

@student Postman과 응용 프로그램 요청 헤더 집합이 다를 수 있으므로 서버가 응용 프로그램과 우편 발송자와 다르게 응답 할 수 있습니다. –