@JsonSerialize @JsonDeserialize和@JSONField
@JsonSerialize
和 @JsonDeserialize
是 Jackson 库中的注解,用于控制对象的序列化和反序列化过程。而 @JSONField
是 FastJSON 库中的注解,用于类似的目的。以下是它们的详细介绍:
Jackson 注解
-
@JsonSerialize
- 作用:指定如何将对象序列化为 JSON。
- 使用场景:当你需要自定义对象的序列化过程时。
- 示例:
import com.fasterxml.jackson.databind.annotation.JsonSerialize; @JsonSerialize(using = CustomSerializer.class) public class MyClass { private String myField; // getters and setters }
-
@JsonDeserialize
- 作用:指定如何将 JSON 反序列化为对象。
- 使用场景:当你需要自定义对象的反序列化过程时。
- 示例:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonDeserialize(using = CustomDeserializer.class) public class MyClass { private String myField; // getters and setters }
FastJSON 注解
- @JSONField
- 作用:指定字段在序列化和反序列化过程中的行为。
- 使用场景:当你需要控制字段的序列化名称、格式化方式等。
- 示例:
import com.alibaba.fastjson.annotation.JSONField; public class MyClass { @JSONField(name = "my_field") private String myField; @JSONField(format = "yyyy-MM-dd") private Date myDate; // getters and setters }
对比
- 库:
@JsonSerialize
和@JsonDeserialize
属于 Jackson 库,而@JSONField
属于 FastJSON 库。 - 功能:Jackson 的注解主要用于自定义序列化和反序列化过程,而 FastJSON 的注解则更多用于控制字段的序列化和反序列化行为。
- 使用场景:如果你使用的是 Jackson 库,应该使用
@JsonSerialize
和@JsonDeserialize
;如果你使用的是 FastJSON 库,则使用@JSONField
。
选择建议
- Jackson:功能强大,支持复杂的序列化和反序列化逻辑,适合需要高度自定义的场景。
- FastJSON:性能较好,配置简单,适合对性能有较高要求且配置需求较少的场景。
CustomSerializer和CustomDeserializer定义
在 Jackson 中,自定义序列化器和反序列化器可以通过继承 JsonSerializer
和 JsonDeserializer
类来实现。以下是如何定义和使用自定义序列化器和反序列化器的详细步骤。
自定义序列化器
-
定义自定义序列化器:
继承JsonSerializer
类并重写serialize
方法。import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; public class CustomSerializer extends JsonSerializer<MyClass> { @Override public void serialize(MyClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); gen.writeStringField("customField", "Custom Value: " + value.getMyField()); gen.writeEndObject(); } }
-
使用自定义序列化器:
在需要使用自定义序列化器的类上添加@JsonSerialize
注解。import com.fasterxml.jackson.databind.annotation.JsonSerialize; @JsonSerialize(using = CustomSerializer.class) public class MyClass { private String myField; // getters and setters }
自定义反序列化器
-
定义自定义反序列化器:
继承JsonDeserializer
类并重写deserialize
方法。import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; public class CustomDeserializer extends JsonDeserializer<MyClass> { @Override public MyClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonNode node = p.getCodec().readTree(p); String customField = node.get("customField").asText(); String myField = customField.replace("Custom Value: ", ""); return new MyClass(myField); } }
-
使用自定义反序列化器:
在需要使用自定义反序列化器的类上添加@JsonDeserialize
注解。import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonDeserialize(using = CustomDeserializer.class) public class MyClass { private String myField; // getters and setters }
完整示例
以下是一个完整的示例,展示如何定义和使用自定义序列化器和反序列化器:
自定义序列化器
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class CustomSerializer extends JsonSerializer<MyClass> {
@Override
public void serialize(MyClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("customField", "Custom Value: " + value.getMyField());
gen.writeEndObject();
}
}
自定义反序列化器
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
public class CustomDeserializer extends JsonDeserializer<MyClass> {
@Override
public MyClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = p.getCodec().readTree(p);
String customField = node.get("customField").asText();
String myField = customField.replace("Custom Value: ", "");
return new MyClass(myField);
}
}
使用自定义序列化器和反序列化器的类
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@JsonSerialize(using = CustomSerializer.class)
@JsonDeserialize(using = CustomDeserializer.class)
public class MyClass {
private String myField;
public MyClass() {
}
public MyClass(String myField) {
this.myField = myField;
}
public String getMyField() {
return myField;
}
public void setMyField(String myField) {
this.myField = myField;
}
}
测试代码
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
MyClass myObject = new MyClass("Hello World");
// 序列化
String jsonString = mapper.writeValueAsString(myObject);
System.out.println("Serialized JSON: " + jsonString);
// 反序列化
MyClass deserializedObject = mapper.readValue(jsonString, MyClass.class);
System.out.println("Deserialized Object: " + deserializedObject.getMyField());
}
}
结果
运行上述代码,你将看到以下输出:
Serialized JSON: {"customField":"Custom Value: Hello World"}
Deserialized Object: Hello World