You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Java单值对象的JSON序列化格式?(Spring Boot+Hibernate)

解决方案

方法一:使用Jackson的@JsonValue注解(推荐)

直接在EmailAddress类的value字段上添加@JsonValue注解,Jackson序列化时会自动将整个EmailAddress对象序列化为该字段的字符串值:

import com.fasterxml.jackson.annotation.JsonValue;

public class EmailAddress {
    @JsonValue
    public String value;

    public String tld() {...}
    public String host() {...}
    public String mailbox() {...}
}

无需修改Customer类,返回的JSON中email字段就会直接显示为字符串形式。

方法二:自定义Jackson序列化器

如果需要更灵活的序列化逻辑(比如空值处理、格式转换等),可以自定义序列化器:

  1. 实现JsonSerializer:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;

public class EmailAddressSerializer extends JsonSerializer<EmailAddress> {
    @Override
    public void serialize(EmailAddress email, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // 可添加自定义逻辑,比如空值判断
        if (email != null) {
            gen.writeString(email.value);
        } else {
            gen.writeNull();
        }
    }
}
  1. 在Customer类的mail字段上指定该序列化器:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import jakarta.persistence.Entity;

@Entity
public class Customer {
    public String name;
    @JsonSerialize(using = EmailAddressSerializer.class)
    public EmailAddress mail;
}

方法三:结合Hibernate持久化优化(如果需要映射数据库列)

如果EmailAddress需要作为数据库字段存储,可以将其标记为@Embeddable,同时配合@JsonValue实现序列化:

  1. 修改EmailAddress类:
import com.fasterxml.jackson.annotation.JsonValue;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;

@Embeddable
public class EmailAddress {
    @JsonValue
    @Column(name = "email") // 指定数据库列名
    public String value;

    public String tld() {...}
    public String host() {...}
    public String mailbox() {...}
}
  1. 修改Customer类:
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;

@Entity
public class Customer {
    public String name;
    @Embedded
    public EmailAddress mail;
}

这样既满足Hibernate的持久化需求,又能让JSON返回期望的格式。

内容的提问来源于stack exchange,提问作者Burner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:35:14