2014-03-29 195 views
0

嗨,我需要它解析到實際的Java對象之前,找出值在JSON一個鍵(即type),但我這樣做會導致以下情況除外:預計BEGIN_ARRAY但BEGIN_OBJECT位於第1行第2列

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 

的Json

{ 
    "type":1, 
    "password":"[email protected]", 
    "role":"normaluser", 
    "name":"Archana Chatterjee", 
    "username":"a.chatterjee", 
    "designation":"Teacher", 
    "id":"T_02", 
    "age":42 
} 

代碼

Type listType = new TypeToken<ArrayList<Pair>>() {}.getType(); 
ArrayList<Pair> list = gson.fromJson(json, listType); 

class Pair { 
    String property; 
    Object value; 
    // has getters and setters 
} 
+0

您的JSON不是數組是一個對象。 – vzamanillo

+0

但我試着用'TypeToken ()'也返回一個空'Pair'對象,即'property'和'value'具有'null'值 – guptakvgaurav

+0

您需要了解Json序列化/反序列化工作。 – vzamanillo

回答

-1

在閱讀this後,我發現了一個更好的方法來解決我的問題。在這裏,我需要一個低級流分析器來獲得JsonObject

 String json3 = "{\"type\":1,\"password\":\"[email protected]\",\"role\":\"normaluser\",\"name\":\"Archana Chatterjee\",\"username\":\"a.chatterjee\",\"designation\":\"Teacher\",\"id\":\"T_02\",\"age\":42}"; 
     JsonParser jParser = new JsonParser(); 
     JsonObject jObject = (JsonObject) jParser.parse(json3); 

現在JsonObject有能力返回一個密鑰的值。 javadoc for same

 JsonElement elem = jObject.get("type"); 

JsoElement's toString()返回的項的值。 (即類型的值在這裏)

 System.out.println(elem); 

輸出

1 
0

首先,我建議你看一看Gson docsJSON specs,因爲它看起來像你失去了,而...

隨着GSON,正常和最簡單的分析你的JSON的方法是創建一個Java類的結構,匹配你的JSON的結構。

在這種情況下,你的JSON是一個對象(它是由{ }包圍)和含有一些性質(即,typepasswordrole等)。

所以,你需要的是創建具有這些屬性(相匹配的名稱)的Java類:

class User 
    String type 
    String password 
    String role 
    // ... 

然後你只需要調用GSON,給它一些JSON字符串,並告訴它在哪一類你想要的是JSON被解析到:

User someUser = gson.fromJson(yourJson, User.class); 

編輯:如果你的JSON可能ç絞刑,你不能用一個類來解析它,所以你有幾個選擇。可能最簡單的一種方法是嘗試將您的JSON解析爲Map結構。

Map是一個對象(如您的JSON是),它包含Key=>Value(例如,'type'=>1)。所以,你可以嘗試分析它likt這樣的:

Type mapType = new TypeToken< Map<String, String> >() {}.getType(); 
HashMap<String, String> map = gson.fromJson(yourJson, mapType); 

注:這種方法的問題是,作爲Java是一種強類型語言,你的JSON必須具有對同一類型(例如,) 。在這種情況下,你的領域'type''age'不是字符串,但整數,但我敢肯定它可以自動將它們轉換成字符串......

如果不能,或者如果它真的很重要解析'type''age'整數,你唯一的選擇是寫一個Custom Deserializer ...

+0

其實我可以接收3種類型的Json,所以哪個json屬於哪個類取決於'type'參數。就像如果type是1那麼我應該使用A.class,如果type是2然後是B.class。這就是爲什麼我說我需要在解析實際數據結構之前獲得'type'值。 – guptakvgaurav

+0

@GauravGupta,請參閱編輯。 – MikO

相關問題