使用改装转换特殊 JSON 响应

Converting special JSON response using retrofit

我正在尝试转换具有可变数量子对象的特定 JSON 对象,feks:

{
   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 实际上是一个对象。我遍历此 JsonObjectdeserialize 值中的每个条目(键值对)。之后,我使用 setter.

将密钥附加到 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生成的map甚至是一个LinkedHashMap,所以条目的顺序是保留的。