Java Spring Boot中如何让POJO返回结果键名与类变量名不同
解决方案
你的问题出在混用了Gson和Jackson两个JSON处理库,且没有正确利用Jackson的注解完成最终序列化。以下是修正方案:
核心问题说明
@JsonProperty是Jackson库的专属注解,Gson无法识别它。你先用Gson把EmpEntity序列化为JSON(此时键名是backGround),再用Jackson反序列化为EmpPojo,这一步能完成字段映射,但如果最终序列化EmpPojo时用了Gson,依然会输出backGround而非BackGround。- Spring Boot默认使用Jackson作为JSON处理工具,建议统一用Jackson完成所有序列化/反序列化操作,避免库冲突。
修改后的代码实现
1. 保持实体类和DTO类不变(补充Entity的getter/setter)
@Entity public class EmpEntity { private String backGround; // 补充getter/setter,让Jackson能访问字段 public String getBackGround() { return backGround; } public void setBackGround(String backGround) { this.backGround = backGround; } } @Data public class EmpPojo { @JsonProperty("BackGround") private String backGround; }
2. 统一用Jackson完成转换与序列化
ObjectMapper objectMapper = new ObjectMapper(); EmpEntity ent = new EmpEntity(); ent.setBackGround("value"); // 直接用Jackson将EmpEntity转换为EmpPojo,无需中转JSON字符串 EmpPojo pojo = objectMapper.convertValue(ent, EmpPojo.class); // 序列化EmpPojo为JSON,此时会按照@JsonProperty指定的键名输出 String resultJson = objectMapper.writeValueAsString(pojo);
3. 预期输出
执行后resultJson的内容为:
{ "BackGround": "value" }
备选方案:如果必须使用Gson
若项目依赖Gson,需将EmpPojo的注解替换为Gson的@SerializedName:
@Data public class EmpPojo { @SerializedName("BackGround") private String backGround; }
转换代码改为全用Gson:
Gson gson = new Gson(); EmpEntity ent = new EmpEntity(); ent.setBackGround("value"); EmpPojo pojo = gson.fromJson(gson.toJson(ent), EmpPojo.class); String resultJson = gson.toJson(pojo);
内容的提问来源于stack exchange,提问作者iswarya
相关产品推荐
相关产品推荐

