2013-07-18 3 views
3

Я использую Gson для создания и анализа JSON, но я столкнулся с одной проблемой. В моем коде я использую это поле:GSI custom deserialization

@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

на самом деле я сделал это таким образом –

Смежные вопросы