GSON non riempie l'elenco di oggetti
Domanda
Ho provato diverse soluzioni e il risultato di analisi JSON con GSON ottiene sempre sbagliato.
Ho il seguente JSON:
{
"account_list": [
{
"1": {
"id": 1,
"name": "test1",
"expiry_date": ""
},
"2": {
"id": 2,
"name": "test2",
"expiry_date": ""
}
}
]
}
Nel mio progetto Java ho le seguenti strutture:
public class Account{
private int id;
private String name;
private String expiry_date;
public Account()
{
// Empty constructor
}
public Account(int id, String name, String expiry_date)
{
this.id = id;
this.name = name;
this.expiry_date = expiry_date;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getExpiryDate() {
return expiry_date;
}
}
e
public class AccountList{
private List <Account> account_list;
public void setAccountList(List <Account> account_list) {
this.account_list = account_list;
}
public List <Account> getAccountList() {
return account_list;
}
}
E quello che faccio di deserializzare è:
Data.account_list = new Gson().fromJson(content, AccountList.class);
Alla fine mi sto List con un solo elemento e con i valori errati. Si può indicare mi prego di quello che sto facendo di sbagliato?
Grazie.
Soluzione
La vostra struttura javabean non corrisponde alla struttura JSON (o viceversa). La struttura account_list
in JSON contiene essenzialmente una matrice con un oggetto solo che a sua volta contiene diverse proprietà Account
, apparentemente utilizzando un indice come chiave di proprietà. Ma GSON si aspetta un array con più oggetti Account
.
Per abbinare la struttura JavaBean, il JSON dovrebbe essere simile a questo:
{
"account_list": [
{"id": 1, "name": "test1", "expiry_date": ""},
{"id": 2, "name": "test2", "expiry_date": ""}
]
}
Se non è possibile modificare la struttura JSON, allora dovete cambiare la struttura Javabean. Ma dal momento che la struttura JSON a proprie ha molto senso, è difficile dare una suggestione appropriata. Un List<Map<Integer, Account>>
invece di List<Account>
in classe AccountList
lavorerà per questo. Ma se si desidera mantenere il List<Account>
, allora avete bisogno di creare un GSON deserializzatore personalizzato.