我试图转换具有可变数量的子对象的特定JSON对象,feks:
{
name: 'Lars Monsen'
id: 192492384
accounts: {
testaccount: {...}
testaccount2: {...}
....
}
}
因此很容易转换除帐户以外的所有字段。由于我不知道每个人拥有多少帐户,因此帐户不是一个列表。如何将此信息映射为对象?
帐户对象内的对象是相同的。但由于帐户不是列表而且帐户名称各不相同,因此我不知道如何正确映射。
是否可以为帐户编写特定的转换器?我试着编写一个特定的转换器,但最终只得到整个对象。
答案 0 :(得分:1)
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;
}
}
正如您所看到的,我为List<Account>
实现了自定义转换器,即使您的json中的account
实际上是一个对象。我遍历此JsonObject
和deserialize
值中的每个条目(键值对)。之后,我使用setter将密钥附加到account
实例。
要正确注册此转换器,请使用:
gsonBuilder.registerTypeAdapter(new TypeToken<List<Account>>(){}.getType(), new AccountsConverter());
答案 1 :(得分:1)
由于accounts
是具有固定值类型的JS对象,为什么不使用具有固定值类型的 Map ?像这样
class Data {
String name;
int id;
Map<String, Account> accounts;
}
class Account {
...
}
刚刚用Gson测试过,它确实有效。 Gson生成的地图甚至是LinkedHashMap,因此保留了条目的顺序。