2013-07-18 114 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

其实我是这样做的 –