我遇到一种特殊情况,即我正在检索具有唯一ID作为其键的对象列表,并且它们还具有嵌套对象,这些对象也具有自己的唯一ID。
我正在使用GSON
创建pojos但是在为这些对象创建模型类时,我需要序列化所有唯一键值,这不是一个好的解决方案。
我附上了一张图片,让您更好地了解我在说什么:
我希望GSON
创建一个NestedObject1
列表,它会自动包含NestedObject2
列表。问题是每个NestedObject
我在考虑做这样的事情:
Objects.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;
}
}
NestedObject2
public class NestedObject2 {
// Same deal here?
}
有关如何解决此问题的任何建议?
编辑:示例JSON OUTPUT
"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
}
},
}
答案 0 :(得分:1)
由于名称不同,您既不能使用注释,也不能在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 = 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);
然后在Gson解析器中注册反序列化器:
Objects{mNestedObjects1=
NestedObject1{mId='-JrEvneZHQV73jxKu0-U', mNestedObjects2=[]}
NestedObject1{mId='-JrF0_yWy_NmrMROB3qp', mNestedObjects2=[]}
NestedObject1{mId='-JrF3XSkpvo2WMzF1osb', mNestedObjects2=[]}
}
输出:
NestedObject2
你需要为std::tie
类定义一个自定义反序列化器,在这里我只用一个空列表填充它,但我想你能够这样做,因为它的原理相同。
希望它有所帮助! : - )