繁体   English   中英

使用改造转换特殊的JSON响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM