2012-07-20 16 views
15

GSON'u çok basit JSON'ları ayrıştırmak için kullanmaya çalışıyorum. İşteGSON: Bir dize bekleniyordu, ancak BEGIN_OBJECT mi?

Gson gson = new Gson(); 

    InputStreamReader reader = new InputStreamReader(getJsonData(url)); 
    String key = gson.fromJson(reader, String.class); 

JSON url yeni döndü: İşte benim kod

E/AndroidRuntime(19447): com.google.gson.JsonSyntaxException:  java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 

Herhangi fikirleri:

{ 
    "access_token": "abcdefgh" 
} 

bu özel durum alıyorum? GSON’da yeniyim.

cevap

23

JSON yapısı "access_token" adlı bir öğeye sahip bir nesnedir - yalnızca basit bir dize değildir. Aşağıdaki gibi bir Harita gibi eşleşen bir Java veri yapısına serpiştirilebilir.

import java.util.Map; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class GsonFoo 
{ 
    public static void main(String[] args) 
    { 
    String jsonInput = "{\"access_token\": \"abcdefgh\"}"; 

    Map<String, String> map = new Gson().fromJson(jsonInput, new TypeToken<Map<String, String>>() {}.getType()); 
    String key = map.get("access_token"); 
    System.out.println(key); 
    } 
} 

Başka bir genel yaklaşım, JSON ile eşleşen daha özel bir Java veri yapısı kullanmaktır. Örneğin: GSON JsonParser kullanarak

import com.google.gson.Gson; 
import com.google.gson.annotations.SerializedName; 

public class GsonFoo 
{ 
    public static void main(String[] args) 
    { 
    String jsonInput = "{\"access_token\": \"abcdefgh\"}"; 

    Response response = new Gson().fromJson(jsonInput, Response.class); 
    System.out.println(response.key); 
    } 
} 

class Response 
{ 
    @SerializedName("access_token") 
    String key; 
} 
+1

Güzel cevap Bruce! –

+0

Json'a yeni bir eski parçacığı vurmak üzereyim, ilk cevabı kısaca anlatabilir miyim, haritayı Tip belirtecine ekleme konusunda kafam karıştı ... ** fromJson() ** yöntemi – SSH

4

Başka bir "düşük düzeyde" olasılık: Özel bir deserializer yazacağım

package stackoverflow.questions.q11571412; 

import com.google.gson.*; 

public class GsonFooWithParser 
{ 
    public static void main(String[] args) 
    { 
    String jsonInput = "{\"access_token\": \"abcdefgh\"}"; 

    JsonElement je = new JsonParser().parse(jsonInput); 

    String value = je.getAsJsonObject().get("access_token").getAsString(); 
    System.out.println(value); 
    } 
} 

gün bir ise JsonElement en iyi arkadaşınız olacak.

+1

Ty. Ben tam olarak böyle bir şey yapıyordum ve bu kesin çözüm gerekiyordu. – Shadoninja

+0

Bir şey değil – giampaolo