gpt4 book ai didi

java - JSON对所有对象都有唯一的键,如何使用GSON转换为POJO?

转载 作者:行者123 更新时间:2023-12-01 11:25:34 24 4
gpt4 key购买 nike

我有一个特殊的情况,我正在检索一个以唯一 ID 作为键的对象列表,并且它们还具有嵌套对象,这些对象也有自己唯一的 ID。

我正在使用GSON创建 pojo,但是在为这些对象创建模型类时,我需要序列化所有唯一的键值,这不是一个好的解决方案。

我附上了一张图片,以便您更好地了解我在说什么:

enter image description here

我要GSON创建 NestedObject1 的列表它本身包含 NestedObject2 的列表。问题在于 NestedObject 的每种类型的键值都是唯一的。

我正在考虑做这样的事情:

对象.java

public class Objects {

@SerializedName("Objects")
private List<NestedObject1> mNestedObjects1;
public List<NestedObject1> getNestedObjects1() {
return mNestedObjects1;
}

}

NestedObjects1.java

public class NestedObject1 {

@SerializedName("WHAT-TO-PUT-HERE?")
private String mId;
public String getId() {
return mId;
}

@SerializedName("WHAT-TO-PUT-HERE?")
private List<NestedObject2> mNestedObjects2;
public List<NestedObject2> getNestedObjects2() {
return mNestedObjects2;
}

}

嵌套对象2

public class NestedObject2 {

// Same deal here?

}

关于如何解决这个问题有什么建议吗?

编辑:示例 JSON 输出

"Objects" : {
"-JrEvneZHQV73jxKu0-U" : {
"-JrEvoBeZaysRRttNGP-" : {
"started" : true
},
"-JrEvqaNyTHhjRIMGR-r" : {
"started" : true
}
},
"-JrF0_yWy_NmrMROB3qp" : {
"-JrF0lWRsa5KmU6SnC7Z" : {
"started" : true
},
"-JrF1txLoFd2w4wN8Q4n" : {
"started" : true
},
"-JrF2skHdMmT9WN3wKVS" : {
"started" : true
}
},
"-JrF3XSkpvo2WMzF1osb" : {
"-JrF3ZYwyxUz0RDooVna" : {
"started" : true
},
"-JrF4D-cesLhqbbzdfT1" : {
"started" : true
},
"-JrF5GufdDqFGjw8aYRB" : {
"started" : true
}
},
}

最佳答案

由于名称不同,因此您不能在 Java 类中使用注释或具有相同名称的字段。

我建议是实现一个自定义反序列化器,这样您就不必关心这些键值。

假设有正确的构造函数,这里是如何为 Objects 类实现反序列化器(顺便说一下,这是一个非常糟糕的名字,因为在JDK)。

class ObjectsDeserializer implements JsonDeserializer<Objects> {
@Override
public Objects deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject().getAsJsonObject("Objects");
List<NestedObject1> list = new ArrayList<>();
for(Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
List<NestedObject2> nestedObject2List = new ArrayList<>();
//here deserialize each NestedObject2 and put it in the list
list.add(new NestedObject1(entry.getKey(), nestedObject2List));
}
return new Objects(list);
}
}

然后在 Gson 解析器中注册反序列化器:

Gson gson = new GsonBuilder()
.registerTypeAdapter(Objects.class, new ObjectsDeserializer())
.registerTypeAdapter(NestedObject2.class, new NestedObject2Deserializer())
.create();

Objects o = gson.fromJson(new FileReader(new File("file.json")), Objects.class);

输出:

Objects{mNestedObjects1=
NestedObject1{mId='-JrEvneZHQV73jxKu0-U', mNestedObjects2=[]}
NestedObject1{mId='-JrF0_yWy_NmrMROB3qp', mNestedObjects2=[]}
NestedObject1{mId='-JrF3XSkpvo2WMzF1osb', mNestedObjects2=[]}
}

您需要为 NestedObject2 类定义一个自定义反序列化器,这里我只是用一个空列表填充它,但我想您将能够做到这一点,因为它的原理相同。

希望对您有帮助! :-)

关于java - JSON对所有对象都有唯一的键,如何使用GSON转换为POJO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30833131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com