2013-04-18 44 views
4

我面對這個錯誤在解析JSON數據Android的JSON錯誤com.google.gson.JsonSyntaxException:java.lang.IllegalStateException

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 

我could'nt找到解決方案。我的JSON數據是:

{ 
    "user": [ 
    { 
     "email": "[email protected]", 
     "firstName": "Wijden", 
     "id": "1", 
     "lastName": "User" 
    }, { 
     "email": "[email protected]", 
     "firstName": "Sample", 
     "id": "2", 
     "lastName": "User" 
    }, { 
     "email": "[email protected]", 
     "firstName": "Ingenieur", 
     "id": "3", 
     "lastName": "User" 
    } 
    ] 
} 

而且我這是怎麼做的:

Type type = new TypeToken<List<WorkItem>>() { }.getType(); 
List<WorkItem> workitems = (List<WorkItem>) new Gson().fromJson(resultat, type); 

我將不勝感激,如果你能幫助我解決tnis問題。在此先感謝

+0

JSONLint是你的朋友:http://jsonlint.com/。在這種情況下,您剪切/粘貼的三條線是有效的。所以問題是「別的東西」。問:你能提供更多的代碼嗎?問:你能否把事情分解成幾個額外的子變量,而不是一次性用「new Gson()。fromJson()」做所有事情? – paulsm4

回答

2

爲了解析您的JSON,我創建類來包裝響應,即:

public class Response { 
    @SerializedName("user") 
    private List<User> userList; 
    //getters and setters 
} 

,並

public class User{ 
    @SerializedName("id") 
    private int id; 
    @SerializedName("email") 
    private String email; 
    @SerializedName("firstName") 
    private String firstName; 
    @SerializedName("lastName") 
    private String lastName; 
    //getters and setters 
} 

然後,爲了解析您的JSON效應初探,你只需要做:

Gson gson = new Gson(); 
Response data = gson.fromJson(yourJsonString, Response.class); 

然後你就可以版本訪問您的數據Ÿ輕鬆,如:

User user = data.getUserList.get(i); 

:使用註釋@SerializedName有趣的是,一個字段的名稱在JSON響應,並在您的應用程序分開,以遵循Java的命名約定的...

+0

感謝您的回覆,註釋@SerializedName是非常有趣的,但我使用REST Web服務與澤西使用jackon不gson任何其他解決方案? – Wijden

+0

我不明白你的觀點......我的解決方案不會修改任何Web服務!這正是你必須在你的應用程序中編寫解析你所得到的JSON響應......並且你正在使用** GSON **,因爲在你的代碼中你有'new Gson()'並且你用*格森* ... – MikO

+0

是的,你是對的,但它沒有工作我有同樣的錯誤 – Wijden

0

當您嘗試解析集合像Gson希望你有一個JSON ARRAY(如錯誤消息指出),而不是一個對象。您的JSON是一個包含ARRAY(一組對象)的對象。

要解析您需要一個Java對象,該對象具有一個集合作爲您的類型。或者,您需要將您的json更改爲數組,或者您可以創建自定義序列化器/反序列化器(或者想出其他一些技巧,但底線是您的JSON不是數組,當下)。

試着改變你分析它到你的Java對象,速戰速決:

public class WorkItemsContainer { 
    private List<WorkItem> workItems; 
    //getters/setters/ctor/etc 
} 

見GSON文檔「使用對象」一節在這裏:https://sites.google.com/site/gson/gson-user-guide#TOC-Object-Examples