2012-07-20 2 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에서 반환 : 여기 내 코드는

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

어떤 아이디어 :

{ 
    "access_token": "abcdefgh" 
} 

나는이 예외를 받고 있어요? 나는 GSON을 처음 사용합니다.

답변

23

JSON 구조체는 "access_token"이라는 요소가 하나있는 개체입니다.이 요소는 단순한 문자열이 아닙니다. 다음과 같이 Map과 같은 일치하는 Java 데이터 구조로 deserialize 될 수 있습니다.

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 데이터 구조를 사용하는 것입니다. 예를 들면 다음과 같습니다 GSON JsonParser을 사용

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

좋은 답변 Bruce! –

+0

나는 Json을 처음 접했을 때 유창하다. ur 첫 답을 간략하게 설명 할 수있다. map을 type token으로 두는 것에 대해 혼란 스럽다. ** fromJson() ** method의 두 번째 매개 변수에 대해 혼란 스럽다. – SSH

4

또 다른 "낮은 수준"가능성 : 사용자 정의 디시리얼라이저를 쓸 것이다

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

+0

당신은 환영합니다. – giampaolo