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

如何用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类代码,动态指定序列化规则:

  1. 定义MixIn接口,指定字段的序列化别名:
public interface TestFirstNameMixIn {
    // 对应Test类的getName方法,序列化时用firstName作为键
    @JsonProperty("firstName")
    String getName();
}
  1. 创建单独的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:42:42