如何借助Jackson与Lombok自动实现POJO的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

