JSON 所有对象都有唯一键,如何使用 GSON 转换为 POJO?
JSON has unique keys for all objects, how to convert to POJO using GSON?
我有一个特殊的情况,我正在检索一个对象列表,这些对象有唯一的 ID 作为它们的键,它们也有嵌套的对象,它们也有自己唯一的 ID。
我正在使用 GSON
创建 pojo,但是在为这些对象创建模型 类 时,我需要序列化所有唯一键值,这不是一个好的解决方案。
我附上了一张图片,让您更好地了解我在说什么:
我希望 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输出
"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 class.
中使用注释或具有相同名称的字段
我的建议是实现自定义反序列化器,这样您就不必关心这些键值。
假设有合适的构造函数,这里是如何为 Objects
class 实现反序列化器(顺便说一句,这是一个非常糟糕的名字,因为已经有一个名为 [=13] 的 class =] 在 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
class 定义一个自定义反序列化器,这里我只是用一个空列表填充它,但我想您可以这样做,因为它是同样的原理。
希望对您有所帮助! :-)
我有一个特殊的情况,我正在检索一个对象列表,这些对象有唯一的 ID 作为它们的键,它们也有嵌套的对象,它们也有自己唯一的 ID。
我正在使用 GSON
创建 pojo,但是在为这些对象创建模型 类 时,我需要序列化所有唯一键值,这不是一个好的解决方案。
我附上了一张图片,让您更好地了解我在说什么:
我希望 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输出
"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 class.
中使用注释或具有相同名称的字段我的建议是实现自定义反序列化器,这样您就不必关心这些键值。
假设有合适的构造函数,这里是如何为 Objects
class 实现反序列化器(顺便说一句,这是一个非常糟糕的名字,因为已经有一个名为 [=13] 的 class =] 在 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
class 定义一个自定义反序列化器,这里我只是用一个空列表填充它,但我想您可以这样做,因为它是同样的原理。
希望对您有所帮助! :-)