2012-07-20 178 views
15

我想用GSON来解析一些非常简单的JSON。这里是我的代码:GSON:期望一个字符串,但是BEGIN_OBJECT?

Gson gson = new Gson(); 

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

这里的JSON从URL返回:

{ 
    "access_token": "abcdefgh" 
} 

我得到这个异常:

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

任何想法?我是GSON的新手。

回答

23

JSON结构是一个名为“access_token”的元素 - 它不仅仅是一个简单的字符串。它可以反序列化为一个匹配的Java数据结构,比如一个Map,如下所示。

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

另一种常见方法是使用与JSON匹配的更具体的Java数据结构。例如:

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

尼斯答案布鲁斯! – 2012-07-20 12:43:59

+0

我可以打一个旧的线程,新的Json,你可以简要解释一下你的第一个答案,我很困惑把Map放入类型token ..关于** fromJson()的第二个参数**()**方法 – SSH 2015-07-28 11:01:40

4

另一个“低级别”的可能性使用GSON JsonParser:

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

如果有一天,你会写一个自定义解串器,JsonElement将是你最好的朋友。

+1

Ty。我正在做这种确切的事情,需要这个确切的解决方案。 – Shadoninja 2016-04-13 16:45:32

+0

不客气 – giampaolo 2016-04-13 18:06:23

相关问题