java - 如何反序列化包含相同键名但使用不同类型的 JSON 文件(使用 Google JSON)?
问题描述
考虑以下 JSON 文件:
{
"version": "1.0",
"firstData": {
"meta": "this is string",
"version": "1"
},
"SecondData": {
"meta": ["string1", "string2", "string3"],
"version": "1"
},
"ThirdData": {
"meta": true,
"version": "1"
},
"FourthData": {
"meta": [true, false, false, true],
"version": "1"
},
"FifthData": {
"meta": [{
"meta": "string",
"version": "2"
},
{
"meta": ["string1","string2"],
"version": "2"
}]
"version": "1"
}
}
正如所见,“元”属性具有不同的数据类型,有时是字符串,有时是 ArrayOfString,有时是布尔等。
由于我的 JSON 文件有多个数据,我希望它遵循以下结构:
class information
{
String version;
HashMap<String,Data> details;
}
class Data
{
variable meta;
String version;
}
如何创建相应的 POJO 并使用 Google GSON 对其进行反序列化?
解决方案
只需定义您的meta
as JsonElement
。然后您将拥有诸如:、、、、、 ...之类的排序方法getAsString
,并且您可以在找出类型后再次对其进行反序列化。getAsBoolean
getAsJsonObject
getAsJsonArray
所以你的班级可能看起来像:
public class SomeClass {
private int version;
private JsonElement meta;
//getters and setters and other stuff
}
编辑:更多阐述和实施
定义两个类:GeneralItem
和GeneralData
class GeneralItem
{
public final int version;
public final JsonElement meta;
}
class GeneralData
{
public final String version;
public final Map<String, GeneralItem> items;
public GeneralData(String version, Map<String, GeneralItem> items)
{
this.version = version;
this.items = items;
}
}
然后我们为我们定义一个自定义反序列化器GeneralData
:
class GeneralDataDeserializer implements JsonDeserializer<GeneralData>
{
@Override
public GeneralData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
final JsonObject object = json.getAsJsonObject();
final String version = object.get("version").getAsString();
object.remove("version");
HashMap<String, GeneralItem> items = new HashMap<>(object.size());
for (Map.Entry<String, JsonElement> item : object.entrySet())
items.put(item.getKey(), context.deserialize(item.getValue(), GeneralItem.class));
return new GeneralData(version, items);
}
}
最后将反序列化器注册到我们的 gson 实例并获取数据:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(GeneralData.class, new GeneralDataDeserializer())
.create();
final String json = "your json here";
final GeneralData data = gson.fromJson(json, GeneralData.class);
System.out.println(data.items.get("firstData").meta.getAsString());
//other parts you want
(请注意,为简洁起见,删除了构造函数、getter 和 setter、错误检查等)
推荐阅读
- spring - Spring Boot Security:如何在 Spring Boot 中的 CSRF 之前运行身份验证过滤器?
- java - 为什么我的 Mongo 聚合不能在嵌套文档上正常工作?
- css - 输入html的多个点
- javascript - 如何通过布尔属性和整数属性对对象数组进行排序,如果该整数属性为 0,则保持接近结尾?
- spring - spring data jpa 无法使用原生 sql 更新数据
- sql - 可以将聚合函数与连接一起使用吗?
- python - 从列表中获取所有不包含相同元素的对
- flutter - Flutter Web - 无法编译,包中的双重导入问题
- json - VS Code 中 json 模式的相对文件路径
- apache-spark - 刚刚安装了火花和斯卡拉。返回不支持的类文件主要版本:58