2015-02-13 5 views
0

Привет Я пишу приложение Android, которое взаимодействует с внешним веб-сервисом, который выводит информацию в формате JSON.GSON Custom parsing

Я использую GSON для создания POJO, для вывода веб-службы, но у меня возникают проблемы с этим объектом:

player: { 
1: { 
    number: "6", 
    name: "Joleon Lescott", 
    pos: "D", 
    id: "2873" 
}, 
2: { 
    number: "11", 
    name: "Chris Brunt", 
    pos: "D", 
    id: "15512" 
}, 
3: { 
    number: "23", 
    name: "Gareth McAuley", 
    pos: "D", 
    id: "15703" 
} 
} 

Используя услугу, как http://www.jsonschema2pojo.org/ я был в состоянии генерировать POJO что соответствует этому выходу, как это:

public class Player { 

    @SerializedName("1") 
    @Expose 
    private com.example._1 _1; 
    @SerializedName("2") 
    @Expose 
    private com.example._2 _2; 
    ..... 
} 

public class _1 { 

@Expose 
private String name; 
@Expose 
private String minute; 
@Expose 
private String owngoal; 
@Expose 
private String penalty; 
@Expose 
private String id; 
.... 
} 

Однако я хотел бы изменить этот немного и вместо того, чтобы иметь объект для _1, _2 и т.д., я хотел бы иметь массив или список, содержащий все данные , например:

public class Players{ 

    private List<Player> players; 

} 

public class Player{ 
    @Expose 
    private int position; 
    @Expose 
    private String name; 
    @Expose 
    private String minute; 
    @Expose 
    private String owngoal; 
    @Expose 
    private String penalty; 
    @Expose 
    private String id; 
    .... 
} 

Как это сделать, без ручного анализа файла JSON?

ответ

3

Зарегистрируйте TypeAdapter для вашего Players класс. В методе deserialize повторите по клавишам в json и добавьте их в ArrayList. Думаю, это должно сработать. Пример в псевдокоде:

class PlayersAdapter implements JsonDeserializer<Players> { 
    public Players deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) { 
     List<Player> players = new ArrayList<>(); 
     for (Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) { 
      players.add(ctx.deserialize(entry.getValue(), Players.class)); 
     } 
     return new Players(players); 
    } 
} 


// ... 
Gson gson = new GsonBuilder() 
     .registerTypeAdapter(Players.class, new PlayersAdapter()) 
     .create(); 
+0

Я попробую, спасибо! –