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