Reputation: 949
I'm trying to convert a specific JSON object that has a variable amount of subobjects, feks:
{
name: 'Lars Monsen'
id: 192492384
accounts: {
testaccount: {...}
testaccount2: {...}
....
}
}
So its easy to convert all the fields except for accounts. Since I don't know how many accounts each person has and accounts isn't a list. How can I map this info as an object?
The objects inside the account objects are the same. But since accounts not a list and the names of the accounts varies, I don't know how to map this properly.
Is it possible to write a specific converter for just accounts? I tried to write a specific converter but that ended up only the whole object.
Upvotes: 0
Views: 590
Reputation: 15064
class Response {
String name;
long id;
List<Account> accounts;
}
// ..
public class AccountsConverter implements JsonDeserializer<List<Account>> {
public List<Account> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) {
List<Account> vals = new ArrayList<Account>();
for (Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
Account account = ctx.deserialize(entry.getValue(), Account.class);
account.setName(entry.getKey());
vals.add(account);
}
return vals;
}
}
As you can see, I implemented a custom converter for List<Account>
, even though account
in your json is actually an object. I iterate over every entry (key-value pair) in this JsonObject
and deserialize
the value. After that I append the key to the account
instance using a setter.
To properly register this converter use this:
gsonBuilder.registerTypeAdapter(new TypeToken<List<Account>>(){}.getType(), new AccountsConverter());
Upvotes: 1
Reputation: 9013
Since accounts
is a JS object with a fixed value type, why not use a Map with fixed value type? Like so
class Data {
String name;
int id;
Map<String, Account> accounts;
}
class Account {
...
}
Just tested it with Gson, and it works. The map generated by Gson is even a LinkedHashMap, so the order of entries is preserved.
Upvotes: 1