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

时间:2015-03-22 21:36:38

标签: java json gson

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

{
   name: 'Lars Monsen'
   id: 192492384
   accounts: {
        testaccount: {...}
        testaccount2: {...}
        ....
   }
}

因此很容易转换除帐户以外的所有字段。由于我不知道每个人拥有多少帐户,因此帐户不是一个列表。如何将此信息映射为对象?

帐户对象内的对象是相同的。但由于帐户不是列表而且帐户名称各不相同,因此我不知道如何正确映射。

是否可以为帐户编写特定的转换器?我试着编写一个特定的转换器,但最终只得到整个对象。

2 个答案:

答案 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实际上是一个对象。我遍历此JsonObjectdeserialize值中的每个条目(键值对)。之后,我使用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,因此保留了条目的顺序。