如何将对象转为JSON字符串并使用@JsonProperty而非字段名
解决JSON序列化时@JsonProperty注解不生效的问题
针对Jackson(ObjectMapper)场景
你遇到的问题大概率是以下几种原因之一,对应解决方案如下:
确认注解导入正确
确保你用的是Jackson官方的@JsonProperty,导入路径必须是:import com.fasterxml.jackson.annotation.JsonProperty;不要误导入Spring或其他框架的同名注解,否则ObjectMapper不会识别。
绑定注解到序列化入口
Jackson默认优先通过getter方法进行序列化,你可以把@JsonProperty直接加到getter方法上,确保注解和序列化逻辑绑定:class A{ private String helloWorld; @JsonProperty("hello_world") public String getHelloWorld(){...} public void setHelloWorld(String s){...} }或者配置ObjectMapper优先识别字段上的注解,跳过getter的影响:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); String json = objectMapper.writeValueAsString(object);排查冲突的全局命名策略
如果之前给ObjectMapper设置了自动驼峰转下划线的全局命名策略(比如SnakeCaseStrategy),可能和注解优先级冲突。此时可以移除全局策略,改用注解单独指定字段名。
针对Gson场景
Gson不支持Jackson的@JsonProperty注解,这是核心问题,你需要改用Gson原生方案:
替换为Gson的
@SerializedName注解
导入Gson原生注解并替换原注解:import com.google.gson.annotations.SerializedName; class A{ @SerializedName("hello_world") private String helloWorld; public String getHelloWorld(){...} public void setHelloWorld(String s){...} }之后用Gson序列化就能得到预期的
"hello_world"键名。自定义TypeAdapter(可选批量处理方案)
如果不想修改类的注解,可以自定义TypeAdapter来识别Jackson的@JsonProperty,但这种方式较繁琐,推荐直接使用Gson原生注解更高效。
内容的提问来源于stack exchange,提问作者Ravi Shekhar
相关产品推荐
相关产品推荐

