gpt4 book ai didi

Java GSON 自定义反序列化器版本控制支持

转载 作者:行者123 更新时间:2023-11-30 05:50:26 24 4
gpt4 key购买 nike

我为我的 Person 类创建了一个自定义反序列化器。这仅用于演示目的。我的实际类(class)更复杂。

json 文件包含格式的版本,然后是人员数组。

在 1.0 版本中,我为每个人都有一个姓名年龄
在 2.0 版本中,我有一个姓名年龄以及性别

我的问题是我无法访问自定义反序列化器中的版本,或者至少还不知道如何获取它。

有没有其他方法可以在没有 jsonObj.get("gender").has(); 的情况下执行此操作
if (jsonObj.get("gender") != null)

GSON版本:2.8.5

解串器:

private class PersonDeserializer implements JsonDeserializer<PersonDatapoint>
{
@Override
public PersonDatapoint deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
JsonObject jsonObj = json.getAsJsonObject();

// version 1.0
Person person = new Person(jsonObj.get("name").getAsString());
person.setAge(jsonObj.get("age").getAsInt());

// version 2.0
// how to determine version field in json File?
// person.setGender(jsonObj.get("gender").getAsString());

return person;
}
}

JSON 文件 v1.0:

{
"version": "1.0",

"persons": [
{
"name": "Alex",
"age": 30
},
{
"name": "John",
"age": 31
},
{
"name": "Elise",
"age": 32
}]
}

JSON 文件 v2.0:

{
"version": "2.0",

"persons": [
{
"name": "Alex",
"age": 30,
"gender": "male"
},
{
"name": "John",
"age": 31,
"gender": "male"
},
{
"name": "Elise",
"age": 32,
"gender": "female"
}]
}

最佳答案

要访问版本字段,请不要为个人创建 JsonDeserializer,而是为您拥有的整个 JSON 创建 JsonDeserializer。因此,让我们假设您的 JSON 是某种可以用 Java 类呈现的响应,例如:

@Getter @Setter
public class Response {
private Double version;
private Person[] persons; // versioned stuff
}

你的类(class) Person 可能是这样的:

@Getter @Setter
public class Person {
@Since(1.0) // these annotations are put just for demonstrative purpose but are
// actually also functional, see deserializer
private String name;
@Since(1.0)
private Integer age;
@Since(2.0)
private String gender;
}

注意:这个 Person 是一个有点糟糕的示例类,因为它可以很容易地被反序列化,而无需任何来自 v1.0 或 v2.0 JSON 的自定义反序列化器。 v1.0 中的反序列化只会让 gender 为空。无论如何,您的自定义反序列化器 - 使用 JSON 字段版本 - 可能看起来像:

public class ResponseDeserializer implements JsonDeserializer<Response> {
@Override
public Response deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
// This is how to get the version
Double version = json.getAsJsonObject().get("version").getAsDouble();
// and below is jsut an example what you could do with version
Gson gson = new GsonBuilder()
.setVersion(version) // this is where @Since might be handy
.setPrettyPrinting()
.create();
return gson.fromJson(json, Response.class);
}
}

关于Java GSON 自定义反序列化器版本控制支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54012489/

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