首页 > 解决方案 > 在 Java 中将枚举序列化为 JSON

问题描述

我有一个 Javaenum存储不同的状态:

public enum BusinessCustomersStatus {
    A("active", "Active"),
    O("onboarding", "Onboarding"),
    NV("not_verified", "Not Verified"),
    V("verified", "Verified"),
    S("suspended", "Suspended"),
    I("inactive", "Inactive");

    @Getter
    private String shortName;

    @JsonValue
    @Getter
    private String fullName;

    BusinessCustomersStatus(String shortName, String fullName) {
        this.shortName = shortName;
        this.fullName = fullName;
    }

    // Use the fromStatus method as @JsonCreator
    @JsonCreator
    public static BusinessCustomersStatus fromStatus(String statusText) {
        for (BusinessCustomersStatus status : values()) {
            if (status.getShortName().equalsIgnoreCase(statusText)) {
                return status;
            }
        }

        throw new UnsupportedOperationException(String.format("Unknown status: '%s'", statusText));
    }
}

完整代码:https ://github.com/rcbandit111/Search_specification_POC/blob/main/src/main/java/org/merchant/database/service/businesscustomers/BusinessCustomersStatus.java

当我想将项目列表放入页面中以获取值时,该代码运行良好,fullName因为我使用了@JsonValue注释。

我有一个需要获取shortValue此代码的案例:

return businessCustomersService.findById(id).map( businessCustomers -> businessCustomersMapper.toFullDTO(businessCustomers));

来源:https ://github.com/rcbandit111/Search_specification_POC/blob/316c97aa5dc34488771ee11fb0dcf6dc1e4303da/src/main/java/org/merchant/service/businesscustomers/BusinessCustomersRestServiceImpl.java#L77

但我明白了fullValue。你知道单行我如何映射shortValue吗?

标签: javaspringspring-boot

解决方案


我建议将其序列化为对象。这可以通过@JsonFormat类级别的注释来完成:

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum BusinessCustomersStatus {
    A("active", "Active"),
    O("onboarding", "Onboarding"),
//...

    @Getter
    private String shortName;

    @Getter
    private String fullName;
//...

序列化此枚举时,这将导致以下结果BusinessCustomersStatus.A

{"shortName":"active","fullName":"Active"}

或者,您可以将status字段定义为String

public class BusinessCustomersFullDTO {

    private long id;

    private String name;

    private String businessType;

    private String status;
}

并像这样映射它的值:

businessCustomersFullDTO.status(businessCustomers.getStatus().getShortName());

推荐阅读