如何用Jackson实现Java对象字段多JSON名称序列化?
用Jackson实现Test类的两种JSON序列化场景
给定原始Test类:
public class Test { private String name; }
要实现两种序列化输出,以下是具体方案:
场景一:序列化后字段名为name,输出{"name": "Bob"}
Jackson默认需要能访问类的字段,最常规的方式是给私有字段添加getter/setter方法,序列化时会自动使用字段名作为JSON键:
// 补充getter/setter后的Test类 public class Test { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
序列化代码:
ObjectMapper mapper = new ObjectMapper(); Test test = new Test(); test.setName("Bob"); // 执行序列化 String json = mapper.writeValueAsString(test); // 输出结果:{"name":"Bob"}
如果不想添加getter/setter,也可以配置Jackson直接序列化私有字段:
ObjectMapper mapper = new ObjectMapper(); // 允许直接访问私有字段 mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); Test test = new Test(); // 通过反射给私有字段赋值 test.getClass().getDeclaredField("name").set(test, "Bob"); String json = mapper.writeValueAsString(test);
场景二:序列化后字段名为firstName,输出{"firstName": "Bob"}
要让同一个类实例输出不同的JSON字段名,推荐使用Jackson的MixIn特性,无需修改原Test类代码,动态指定序列化规则:
- 定义MixIn接口,指定字段的序列化别名:
public interface TestFirstNameMixIn { // 对应Test类的getName方法,序列化时用firstName作为键 @JsonProperty("firstName") String getName(); }
- 创建单独的ObjectMapper并注册MixIn,执行序列化:
ObjectMapper aliasMapper = new ObjectMapper(); // 给Test类绑定MixIn规则 aliasMapper.addMixIn(Test.class, TestFirstNameMixIn.class); Test test = new Test(); test.setName("Bob"); String json = aliasMapper.writeValueAsString(test); // 输出结果:{"firstName":"Bob"}
如果是直接序列化私有字段(未添加getter),MixIn也可以直接针对字段定义:
public interface TestFirstNameMixIn { @JsonProperty("firstName") String name; }
内容的提问来源于stack exchange,提问作者user518066
相关产品推荐
相关产品推荐

