当@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
相关产品推荐
相关产品推荐

