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

如何借助Jackson与Lombok自动实现POJO的JSON格式toString输出

用Jackson + Lombok自动生成JSON格式的toString方法

我想要执行以下代码时,直接输出JSON格式的对象内容:

System.out.printf("My obj: %s\n", myObject);

目前的做法是在每个POJO里重写toString方法,代码如下:

@Override
public String toString() {
    ObjectMapper mapper = new ObjectMapper();
    String retVal = null;
    try {
        retVal = mapper.writeValueAsString(this);
    }
    catch (JsonProcessingException ignored) {
    }
    return retVal;
}

但每个POJO都要写一遍太麻烦了。我同时在用Jackson和Project Lombok,想知道有没有注解或者自动化的实现方式;另外我试过在基类里实现这个toString方法,但子类没法复用,只有子类自己实现的时候才生效。


解决方案

1. 抽象基类复用方案(最省心)

创建一个抽象基类,把Jackson序列化的toString逻辑封装进去,所有POJO直接继承这个基类即可,注意子类不要用Lombok的@ToString注解(避免覆盖父类的toString实现):

public abstract class BaseJsonPojo {
    // 单例ObjectMapper,避免重复创建提升性能
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    @Override
    public String toString() {
        try {
            return OBJECT_MAPPER.writeValueAsString(this);
        } catch (JsonProcessingException e) {
            // 序列化失败时返回默认对象标识,避免报错中断
            return super.toString();
        }
    }
}

POJO继承该基类,用Lombok的@Data/@Getter/@Setter生成其他方法:

@Data
public class User extends BaseJsonPojo {
    private String name;
    private int age;
    private String email;
}

打印User对象时,会直接输出JSON格式的字符串。

2. Lombok @Delegate注解方案(无需继承基类)

如果不想让POJO强制继承统一基类,可以用Lombok的@Delegate注解,把JSON序列化的toString逻辑注入到POJO中:

先定义一个带default toString方法的接口:

public interface JsonToString {
    ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    default String toString() {
        try {
            return OBJECT_MAPPER.writeValueAsString(this);
        } catch (JsonProcessingException e) {
            return super.toString();
        }
    }
}

在POJO中添加@Delegate注解引入该接口:

@Data
@Delegate(types = JsonToString.class)
public class Product {
    private Long id;
    private String productName;
    private BigDecimal price;
}

Lombok会自动生成toString方法,调用接口的default实现,输出JSON格式内容。


为什么之前基类的toString子类没生效?

你遇到的子类无法复用基类toString的问题,核心原因是子类使用了Lombok的@ToString注解——这个注解会自动生成子类专属的toString方法,直接覆盖父类的实现。

如果一定要在子类中用@ToString,可以加上callSuper = true参数,但这样生成的toString是Lombok默认格式(如User(name=xxx, age=18))拼接父类的JSON,不符合纯JSON输出的需求,所以不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:48:30