2013-07-18 166 views
3

我使用Gson創建和解析JSON,但是我遇到了一個問題。在我的代碼使用這個字段:Gson自定義反序列化

@Expose 
private ArrayList<Person> persons = new ArrayList<Person>(); 

但我的JSON是格式化這樣的:

persons:{count:"n", data:[...]} 

數據是人的數組。

有什麼辦法可以將這個JSON轉換成我的班級使用Gson?我可以使用JsonDeserializer嗎?

回答

6

你需要一個自定義解串器(http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/JsonDeserializer.html),是這樣的:

public static class MyJsonAdapter implements JsonDeserializer<List<Person>> 
    { 
    List<Person> people = new ArrayList<>(); 
    public List<Person> deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) 
     throws JsonParseException 
    { 
     for (each element in the json data array) 
     { 
     Person p = context.deserialize(jsonElementFromArray,Person.class); 
     people.add(p); 
     } 
    } 
    return people; 
    } 
+0

我已經試過您的解決方案,但有仍然發生「IllegalStateException:預期BEGIN_ARRAY但是BEGIN_OBJECT」。這裏是我的實現:http://pastebin.com/4ZYs0S9A –

+0

它基本上是僞代碼,不是你可以放入的東西。你必須得到與數據相對應的正確元素,然後解析它。看到這裏的反序列化方法(從1089開始),這是一個我曾經寫過的複雜的反序列化器:https://github.com/chriskessel/MyHex/blob/master/src/kessel/hex/domain/Player.java –

+0

感謝您的回覆!我只是無法處理序列化程序,但現在,似乎,我終於明白了 –

4

你可以試試下面的代碼解析您的JSON

String jsonInputStr = "{count:"n", data:[...]}"; 

Gson gson = new Gson(); 
JsonObject jsonObj = gson.fromJson(jsonInputStr, JsonElement.class).getAsJsonObject(); 
List<Person> persons = gson.fromJson(jsonObj.get("data").toString(), new TypeToken<List<Person>>(){}.getType()); 
+0

其實我是這樣做的 –