[英]Converting special JSON response using retrofit
我正在尝试转换具有可变数量的子对象的特定JSON对象,例如:
{
name: 'Lars Monsen'
id: 192492384
accounts: {
testaccount: {...}
testaccount2: {...}
....
}
}
因此,很容易转换除帐户外的所有字段。 因为我不知道每个人有多少个帐户,所以帐户不是列表。 如何将此信息映射为对象?
帐户对象内的对象相同。 但是由于帐户不是列表,并且帐户名称各不相同,因此我不知道如何正确映射。
是否可以为帐户编写特定的转换器? 我试图编写一个特定的转换器,但最终只剩下整个对象。
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
该值。 之后,我使用设置器将密钥附加到account
实例。
要正确注册此转换器,请使用以下命令:
gsonBuilder.registerTypeAdapter(new TypeToken<List<Account>>(){}.getType(), new AccountsConverter());
由于accounts
是具有固定值类型的JS对象,为什么不使用具有固定值类型的Map ? 像这样
class Data {
String name;
int id;
Map<String, Account> accounts;
}
class Account {
...
}
刚刚用Gson测试过,它就可以工作。 Gson生成的地图甚至是LinkedHashMap,因此保留了条目的顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.