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

如何将对象转为JSON字符串并使用@JsonProperty而非字段名

解决JSON序列化时@JsonProperty注解不生效的问题

针对Jackson(ObjectMapper)场景

你遇到的问题大概率是以下几种原因之一,对应解决方案如下:

  1. 确认注解导入正确
    确保你用的是Jackson官方的@JsonProperty,导入路径必须是:

    import com.fasterxml.jackson.annotation.JsonProperty;
    

    不要误导入Spring或其他框架的同名注解,否则ObjectMapper不会识别。

  2. 绑定注解到序列化入口
    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);
    
  3. 排查冲突的全局命名策略
    如果之前给ObjectMapper设置了自动驼峰转下划线的全局命名策略(比如SnakeCaseStrategy),可能和注解优先级冲突。此时可以移除全局策略,改用注解单独指定字段名。


针对Gson场景

Gson不支持Jackson的@JsonProperty注解,这是核心问题,你需要改用Gson原生方案:

  1. 替换为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"键名。

  2. 自定义TypeAdapter(可选批量处理方案)
    如果不想修改类的注解,可以自定义TypeAdapter来识别Jackson的@JsonProperty,但这种方式较繁琐,推荐直接使用Gson原生注解更高效。


内容的提问来源于stack exchange,提问作者Ravi Shekhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:20:22