gpt4 book ai didi

java - Jackson - 仅覆盖特定字段的自定义序列化程序

转载 作者:太空狗 更新时间:2023-10-29 22:32:57 24 4
gpt4 key购买 nike

我知道如何在 Jackson 中使用自定义序列化程序(通过扩展 JsonSerializer),但我希望默认序列化程序适用于所有字段,除了只有 1 个字段,我想使用自定义序列化器。

注释不是一个选项,因为我正在序列化一个生成的类(来自 Thrift)。

在编写自定义 jackson 序列化程序时,如何仅指定要覆盖的某些字段?

更新:

这是我要序列化的类:

class Student {
int age;
String firstName;
String lastName;
double average;
int numSubjects

// .. more such properties ...
}

上面的类有很多属性,其中大部分使用原生类型。我只想重写自定义序列化程序中的一些属性,让 Jackson 像往常一样处理其余部分。例如我只想将“年龄”字段转换为自定义输出。

最佳答案

假设你的目标类是

public class Student {
int age;
String firstName;
String lastName;
double average;
int numSubjects;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public double getAverage() {
return average;
}

public void setAverage(double average) {
this.average = average;
}

public int getNumSubjects() {
return numSubjects;
}

public void setNumSubjects(int numSubjects) {
this.numSubjects = numSubjects;
}

}

您需要编写一个自定义序列化程序,如下所示

public class MyCustomSerializer extends JsonSerializer<Student> {

@Override
public void serialize(Student value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
if (value != null) {
jgen.writeStartObject();
jgen.writeStringField("age", "Age: " + value.getAge()); //Here a custom way to render age field is used
jgen.writeStringField("firstName", value.getFirstName());
jgen.writeStringField("lastName", value.getLastName());
jgen.writeNumberField("average", value.getAverage());
jgen.writeNumberField("numSubjects", value.getNumSubjects());
//Write other properties
jgen.writeEndObject();
}
}

}

然后将其添加到ObjectMapper

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule("custom",
Version.unknownVersion());
module.addSerializer(Student.class, new MyCustomSerializer());
mapper.registerModule(module);

然后像这样使用它

Student s = new Student();
s.setAge(2);
s.setAverage(3.4);
s.setFirstName("first");
s.setLastName("last");
s.setNumSubjects(3);

StringWriter sw = new StringWriter();
mapper.writeValue(sw, s);
System.out.println(sw.toString());

它会产生类似的 o/p

{"age":"Age: 2","firstName":"first","lastName":"last","average":3.4,"numSubjects":3}

关于java - Jackson - 仅覆盖特定字段的自定义序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15378853/

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