2017-01-14 5 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 ..... в частности, чтобы отображать ваши POJO Java в/из json, а не с помощью специального кода. –

ответ

4

Ваш пар. является прекрасным. Если предоставленный фрагмент кода действительно относится к трассировке стека исключений, то я полагаю, что свойство response JSON, которое вы пытаетесь проанализировать, имеет значение, отличное от строки. Например,

{ "response": "ok" } 

может быть проанализирован вашим парсером в порядке. Тем не менее, самое близкое сообщение исключения вы можете получить с помощью синтаксического анализа является JSON аналогично приведенному ниже:

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

, что должно произойти сбой с чем-то вроде

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

Также отметит, что Gson сообщает проблематичное место в наименее в его последних версиях (я тестировал его с помощью 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 и ваш набор заголовков запросов приложений могут отличаться, поэтому сервер может по-разному реагировать на ваше приложение и Postman. –

 Смежные вопросы

  • Нет связанных вопросов^_^