jackson序列化枚举类

在Java中,当序列化枚举时,默认只会输出枚举的名字。但若枚举包含多个字段,如`StatusEnum`,仅序列化名字会导致信息丢失。通过在枚举类上添加`@JsonFormat(shape=JsonFormat.Shape.OBJECT)`注解,可以确保序列化为包含所有字段的对象。这样在序列化`StatusEnum`数组时,将得到包含`code`和`name`的对象数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

在序列化枚举字段的时候,出现只序列化一个string的枚举名字。这对于普通java枚举类问题不大的,但是对于稍复杂一点java枚举类,就会出现字段丢失的情况。例如,如下枚举类:



import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;


@Getter
@AllArgsConstructor
public enum StatusEnum {
    OPEN(1, "开启"),
    CLOSE(2, "关闭");

    private final int code;
    private final String name;

    public static StatusEnum getByCode(int code){
        for (StatusEnum value : values()) {
            if (value.getCode() == code) {
                return value;
            }
        }
        return null;
    }
}

使用上述枚举类作为属性,序列化出来的结果为:
OPEN
序列化出来的结果是枚举名字,但是,我们期望序列化出来的结果为一个对象,如下:

{
    "code": 1,
    "name": "开启"
}

解决

只需在枚举类上加上如下注解即可:

@JsonFormat(shape = JsonFormat.Shape.OBJECT)

即如下:

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@Getter
@AllArgsConstructor
public enum StatusEnum {
    OPEN(1, "开启"),
    CLOSE(2, "关闭");

    private final int code;
    private final String name;

    public static StatusEnum getByCode(int code){
        for (StatusEnum value : values()) {
            if (value.getCode() == code) {
                return value;
            }
        }
        return null;
    }
}

获取枚举数组:

List<StatusEnum> result = Arrays.asList(StatusEnum.values());

这样直接返回这个枚举数组result,就是对于的序列化枚举对象数组json,简单粗暴。

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值