@JsonSerialize的使用

本文介绍如何使用@JsonSerialize注解将Date类型的属性转换为Long类型的时间戳,通过自定义序列化器Data2LongSerizlizer,实现从毫秒级时间戳到秒级时间戳的转换。

@JsonSerialize注解,可以实现date数据转换成long型数据等功能,该注解作用在属性的getter()方法上
用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。因为在java中日期时期的时间戳是ms,我现在需要将ms转换为s,就需要将ms/1000

package com.whf.utils.serializer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.util.Date;

import java.io.IOException;

/**
 *该类可以将data转换成long类型
 */
public class Data2LongSerizlizer extends JsonSerializer<Date> {


    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        //将毫秒值转换成秒变成long型数据返回
        jsonGenerator.writeNumber(date.getTime()/1000);
    }

//创建时间
@JsonSerialize(using = Data2LongSerizlizer.class )
private Date createTime;
//更新时间
@JsonSerialize(using = Data2LongSerizlizer.class )
private Date updateTime;

这样就完成了13-10位的时间戳转换。

<think>我们被要求提供@JsonSerialize注解的使用指南。根据提供的引用内容,我们可以总结以下几点: 1. @JsonSerialize是Jackson库中的注解,用于自定义序列化过程。 2. 它可以应用于字段或getter方法上。 3. 主要用途:在将Java对象转换为JSON时,对特定字段进行自定义序列化。 具体用法: - 基本使用:在字段或getter方法上添加`@JsonSerialize`注解,并指定一个自定义的序列化器(继承自`JsonSerializer`)。 - 常用属性: - `using`:指定自定义的序列化器类(必须扩展`JsonSerializer`)。 - `include`(已过时,在旧版本中用于指定包含规则,如`Inclusion.NON_NULL`,但新版本Jackson中推荐使用`@JsonInclude`注解代替)。 - `nullsUsing`:当字段值为null时使用的自定义序列化器。 示例场景: 1. 忽略null值(现在更推荐使用`@JsonInclude(JsonInclude.Include.NON_NULL)`): ```java // 旧版本用法(已过时) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private String name; ``` 2. 将Date类型的时间戳从毫秒转换为秒: ```java @JsonSerialize(using = DateToLongSerializer.class) private Date createTime; // 自定义序列化器 public class DateToLongSerializer extends JsonSerializer<Date> { @Override public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeNumber(value.getTime() / 1000); } } ``` 3. 将枚举类型或其他类型转换为自定义字符串表示: ```java @JsonSerialize(using = GenderSerializer.class) private Gender gender; // 自定义序列化器 public class GenderSerializer extends JsonSerializer<Gender> { @Override public void serialize(Gender value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.getCode()); // 假设Gender枚举有getCode方法返回字符串代码 } } ``` 4. 处理null值的情况: ```java @JsonSerialize(nullsUsing = MyNullSerializer.class) private String optionalField; // 自定义null序列化器 public class MyNullSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString("NULL_VALUE"); // 当字段为null时,序列化为字符串"NULL_VALUE" } } ``` 注意事项: - 自定义序列化器需要继承`JsonSerializer<T>`,其中`T`是要序列化的字段类型。 - 实现`serialize`方法,在该方法中编写自定义序列化逻辑。 - 在序列化时,Jackson会调用自定义序列化器的`serialize`方法来生成JSON。 根据引用[4],还可以将注解用于整型字段,自定义其序列化方式,例如将状态码转换为更易读的字符串。 总结步骤: 1. 创建自定义序列化器类,继承`JsonSerializer`并实现`serialize`方法。 2. 在需要自定义序列化的字段或getter方法上使用`@JsonSerialize(using = MySerializer.class)`。 3. 如果需要特殊处理null值,可以使用`@JsonSerialize(nullsUsing = MyNullSerializer.class)`。 以上便是@JsonSerialize注解的基本使用指南。 §§相关问题§§ 1. @JsonSerialize和@JsonInclude有什么区别? 2. 如何为同一个字段同时指定非null和自定义序列化? 3. 自定义序列化器时,如何序列化复杂对象(如嵌套对象)? 4. @JsonSerialize注解能否用于反序列化?如果不能,应该使用什么注解? </think> ### @JsonSerialize 使用指南 `@JsonSerialize` 是 Jackson 库中的注解,用于**自定义 Java 对象序列化为 JSON 的过程**。以下是核心用法总结: --- ### 一、基础用法 1. **作用位置** 可标记在字段或 getter 方法上: ```java // 字段上使用 @JsonSerialize(using = CustomSerializer.class) private Date createTime; // Getter 方法上使用 @JsonSerialize(using = CustomSerializer.class) public Date getCreateTime() { return createTime; } ``` 2. **核心参数** - `using`:指定自定义序列化器(必须继承 `JsonSerializer`) - `nullsUsing`:当字段值为 `null` 时使用的序列化器 - `include`(旧版):控制序列化范围(如 `JsonSerialize.Inclusion.NON_NULL` 忽略 null 值)[^1] --- ### 二、常见场景示例 #### 1. 转换时间格式(毫秒 → 秒) ```java public class DateToLongSerializer extends JsonSerializer<Date> { @Override public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeNumber(date.getTime() / 1000); // 毫秒转秒 } } // 实体类字段 @JsonSerialize(using = DateToLongSerializer.class) private Date createTime; ``` 序列化结果:`{"createTime": 1680000000}`(原 Date 对象 → 秒级时间戳)[^3] #### 2. 忽略 null 值 ```java @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private String optionalField; ``` 当 `optionalField` 为 `null` 时,该字段不会出现在 JSON 中。 #### 3. 自定义 null 处理 ```java @JsonSerialize(nullsUsing = NullSerializer.class) private String nullableField; public class NullSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeString("DEFAULT_VALUE"); // null 时返回默认值 } } ``` #### 4. 枚举类型序列化 ```java public enum Status { ACTIVE, INACTIVE } public class StatusSerializer extends JsonSerializer<Status> { @Override public void serialize(Status status, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeString(status.name().toLowerCase()); // 输出小写枚举名 } } // 使用 @JsonSerialize(using = StatusSerializer.class) private Status status; ``` 序列化结果:`{"status": "active"}`[^4] --- ### 三、自定义序列化器步骤 1. **创建序列化器** 继承 `JsonSerializer` 并实现 `serialize()`: ```java public class CustomSerializer extends JsonSerializer<TargetType> { @Override public void serialize(TargetType value, JsonGenerator gen, SerializerProvider provider) throws IOException { // 自定义序列化逻辑 gen.writeString(transform(value)); } } ``` 2. **关联字段** 通过 `@JsonSerialize(using = CustomSerializer.class)` 绑定到目标字段。 --- ### 四、注意事项 1. **与反序列化注解区分** 反序列化需使用 `@JsonDeserialize`(配合 `JsonDeserializer`)[^2]。 2. **优先级规则** 字段注解优先级高于 getter 方法注解。 3. **新版替代方案** `include = NON_NULL` 在 Jackson 2.9+ 中建议改用 `@JsonInclude(Include.NON_NULL)`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值