序列化和反序列化

@JsonSerialize @JsonDeserialize和@JSONField

@JsonSerialize@JsonDeserialize 是 Jackson 库中的注解,用于控制对象的序列化和反序列化过程。而 @JSONField 是 FastJSON 库中的注解,用于类似的目的。以下是它们的详细介绍:

Jackson 注解

  1. @JsonSerialize

    • 作用:指定如何将对象序列化为 JSON。
    • 使用场景:当你需要自定义对象的序列化过程时。
    • 示例
      import com.fasterxml.jackson.databind.annotation.JsonSerialize;
      
      @JsonSerialize(using = CustomSerializer.class)
      public class MyClass {
          private String myField;
      
          // getters and setters
      }
      
  2. @JsonDeserialize

    • 作用:指定如何将 JSON 反序列化为对象。
    • 使用场景:当你需要自定义对象的反序列化过程时。
    • 示例
      import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
      
      @JsonDeserialize(using = CustomDeserializer.class)
      public class MyClass {
          private String myField;
      
          // getters and setters
      }
      

FastJSON 注解

  1. @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 中,自定义序列化器和反序列化器可以通过继承 JsonSerializerJsonDeserializer 类来实现。以下是如何定义和使用自定义序列化器和反序列化器的详细步骤。

自定义序列化器

  1. 定义自定义序列化器
    继承 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();
        }
    }
    
  2. 使用自定义序列化器
    在需要使用自定义序列化器的类上添加 @JsonSerialize 注解。

    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    
    @JsonSerialize(using = CustomSerializer.class)
    public class MyClass {
        private String myField;
    
        // getters and setters
    }
    

自定义反序列化器

  1. 定义自定义反序列化器
    继承 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);
        }
    }
    
  2. 使用自定义反序列化器
    在需要使用自定义反序列化器的类上添加 @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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你这个代码我看不懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值