2017-01-14 31 views
8

Basit bir JSON yanıtını okumaya çalışıyorum.Gson: Bir dize bekleniyordu ama BEGIN_OBJECT

{ "response": "ok" }

İşte benim kodudur:

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(); 

Ama bu hatayı alıyorum:

Expected a string but was BEGIN_OBJECT

ben yanlış yapıyorum anlamıyorum. Bana yardımcı olabilir misiniz?

+0

Böyle bir şey için 'gson 'kütüphanesinin kullanılması şiddetle tavsiye edilir .... boilerplate kod tonunu kaldırır ve daha az hata eğilimli. –

+0

JsonReader, Gson kütüphanenizde – student

+0

https://github.com/google/gson ..... adresinde olup, özellikle Java POJO'larınızı özel kod kullanmak yerine json'a eşlemek için kullanılır. –

cevap

4

Ayrıştırıcınız iyi. Sağladığınız kod snippet'i aldığınız özel durum yığın izine aitse, ayrıştırmaya çalıştığınız JSON öğesinin response özelliğinin bir dize dışında bir değere sahip olduğuna inanıyorum. Örneğin,

{ "response": "ok" } 

gayet senin çözümleyici tarafından çözümlenebilir. Ayrıca

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

gibi bir şeyle başarısız olması

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

GSON sorunlu yeri raporlarında dikkat: Ancak, ayrıştırıcı ile alabilirsiniz yakın istisna mesajı JSON aşağıdakine benzer En son sürümlerinde (Gson 2.5 ile test ettim). Sadece beklenen girişi aldığınızdan emin olun. Yanıtın bahsettiğiniz formatta olması gerektiğine inanıyorsanız, sadece giriş akışını izlemeyi ve farklılıkları bulmayı deneyin. En basit fakat en verimli uygulanmasında bir giriş akışı izleme ve böyle bir miktar daha verimli izleme okuyucu olabilir:

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(); 
     } 
    }; 
} 

ile:

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

Sonra sadece eğer tekrar kontrol { "response": "ok" }'u gerçekten alıyoruz.

+0

Cevabınız için teşekkürler. Ben postacı ile yanıtı kontrol ettim ve başlangıçta burada yayınladığım yanıtı onaylayabilirim. – student

+0

@student Postman ve uygulama isteği başlıklarınız farklı olabilir, bu nedenle sunucu uygulamanıza ve Postman'a farklı yanıt verebilir. –