Java 使用改型转换特殊JSON响应

Java 使用改型转换特殊JSON响应,java,json,gson,Java,Json,Gson,我正在尝试转换一个特定的JSON对象,该对象具有可变数量的子对象,fek: { name: 'Lars Monsen' id: 192492384 accounts: { testaccount: {...} testaccount2: {...} .... } } 因此,很容易转换除帐户以外的所有字段。因为我不知道每个人有多少账户,账户不是一个列表。如何将此信息映射为对象 帐户对象中的对象是相同的。但是由于账户不是一个列

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

{
   name: 'Lars Monsen'
   id: 192492384
   accounts: {
        testaccount: {...}
        testaccount2: {...}
        ....
   }
}
因此,很容易转换除帐户以外的所有字段。因为我不知道每个人有多少账户,账户不是一个列表。如何将此信息映射为对象

帐户对象中的对象是相同的。但是由于账户不是一个列表,而且账户的名称也各不相同,我不知道如何正确地映射这一点


是否可以只为帐户编写特定的转换器?我试图编写一个特定的转换器,但结果只是整个对象。

既然
帐户
是具有固定值类型的JS对象,为什么不使用具有固定值类型的映射?像这样

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;
    }
}
class Data {
    String name;
    int id;
    Map<String, Account> accounts;
}

class Account {
    ...
}
类数据{
字符串名;
int-id;
地图帐户;
}
类别帐户{
...
}

刚用Gson测试过,它可以正常工作。Gson生成的映射甚至是LinkedHashMap,因此条目的顺序被保留。

testaccount和testaccount2是否具有相同的值?@KonradKrakowiak是的,它们具有相同的子类型、子对象、子类型、“值”等等。您将向GsonBuilder注册哪种对象类型的转换器?我使用
Gson Gson=new GsonBuilder()失败。registerTypeAdapter(Object.class,new AccountsConverter()).create()
和其他变体,用一些其他类型替换
Object.class
。我成功地用
Gson-Gson=new-GsonBuilder()注册了转换器。registerTypeAdapter(new-TypeToken(){}.getType(),new-AccountsConverter()).create()。它将其他
列表
属性(如果您有)保留给默认转换器,但将尝试从JSON对象反序列化每个
列表
。@ChristianSemrau是的,您的注册是正确的。我将把它添加到答案中。我想对两个答案进行投票,但另一个答案是最简单的!我想把两个答案都投上一票,但这赢得了简单性竞赛!
class Data {
    String name;
    int id;
    Map<String, Account> accounts;
}

class Account {
    ...
}