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

当@JsonProperty与属性名不一致时如何打印对应JSON对象?

可行实现方案

方案1:使用Jackson序列化对象为JSON字符串打印

这是实现成本最低的方案,Jackson本身会自动读取@JsonProperty注解的别名输出,代码示例:

import com.fasterxml.jackson.databind.ObjectMapper;

// 全局定义ObjectMapper(线程安全,无需重复创建)
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

// 打印日志处直接调用
log.info("Object Person: {}", OBJECT_MAPPER.writeValueAsString(personInstance));

输出默认是JSON结构,如果需要匹配你示例里的类名(属性=值)格式,简单替换JSON字符串的首尾大括号即可。

方案2:手动重写toString()方法

如果类的数量少、属性变动频率低,直接重写toString方法写死别名即可:

class Person {
    @JsonProperty("alternativeName")
    private String name;
    // 其他属性...

    @Override
    public String toString() {
        return "Person(" +
                "alternativeName=" + name +
                // 其他属性按规则拼接
                ')';
    }
}

直接打印对象就会输出你需要的格式。

方案3:基于反射的通用ToString工具

如果有大量类需要实现该需求,可以写一个通用工具类,反射读取字段上的@JsonProperty注解值作为别名拼接输出:

import com.fasterxml.jackson.annotation.JsonProperty;
import java.lang.reflect.Field;

public class JsonPropertyToStringUtils {
    public static String toString(Object obj) throws IllegalAccessException {
        Class<?> clazz = obj.getClass();
        StringBuilder sb = new StringBuilder(clazz.getSimpleName()).append("(");
        Field[] fields = clazz.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            field.setAccessible(true);
            // 优先取JsonProperty别名,没有则用原字段名
            String alias = field.isAnnotationPresent(JsonProperty.class) 
                    ? field.getAnnotation(JsonProperty.class).value() 
                    : field.getName();
            sb.append(alias).append("=").append(field.get(obj));
            if (i != fields.length - 1) {
                sb.append(", ");
            }
        }
        sb.append(")");
        return sb.toString();
    }
}

使用时直接调用工具类即可:

log.info("Object {}", JsonPropertyToStringUtils.toString(personInstance));

如果需要打印父类属性,可自行扩展工具类遍历父类字段。

方案4:Lombok自定义ToString配置

如果项目使用Lombok,可以给字段添加@ToString.Include指定别名,和@JsonProperty保持一致即可:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.ToString;

@ToString
class Person {
    @JsonProperty("alternativeName")
    @ToString.Include(name = "alternativeName")
    private String name;
}

Lombok自动生成的toString方法会直接使用别名输出。


内容的提问来源于stack exchange,提问作者leandro.dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:06:02