【问题标题】:Jackson Not Overriding Getter with @JsonPropertyJackson 没有使用 @JsonProperty 覆盖 Getter
【发布时间】:2015-12-26 21:10:13
【问题描述】:

JsonProperty 没有覆盖杰克逊从 getter 获得的默认名称。如果我用ObjectMapper 和jackson 序列化下面的类,我会得到

{"hi":"hello"}

如您所见,JsonProperty 注释无效

class JacksonTester {
    String hi;

    @JsonProperty("hello")
    public String getHi() {
        return hi;
    }
}   

@JsonProperty 放在字符串本身上也不起作用。似乎我可以更改名称的唯一方法是重命名 getter,唯一的问题是它的第一个字母总是小写

【问题讨论】:

    标签: java json serialization jackson getter


    【解决方案1】:

    将它放在变量上,而不是 getter 上

    class JacksonTester {
        @JsonProperty("hello")
        private String hi;
    
        public String getHi() {
            return hi;
        }
    } 
    

    【讨论】:

    • 试过了,不行。唯一可行的方法是重命名我不想做的吸气剂
    • 您尝试过详细版本@JsonProperty(value = "hello") 是在现场还是在吸气剂上?
    • @francescoforesti 试过了,但没有任何作用
    • 好的。您是否已经阅读此内容:stackoverflow.com/questions/21125173/…?一条评论说,如果您有 2 个包含相同注释的库,并且使用了错误的一个,则可能会发生这种情况。
    【解决方案2】:

    下面你试过了吗

    class JacksonTester {
        private String hi;
    
        @JsonProperty("hello")
        public String getHi() {
            return hi;
        }
    }   
    

    我的意思是将“hi”变量声明设为私有。 或者尝试将@JsonIgnore 放在变量声明上,以防您希望将其保留在默认范围内。

    【讨论】:

    • @tt_Gantz 在查看了您对真正根本原因的回答后,如果我的解决方案有效,我会感到惊讶。
    【解决方案3】:

    问题是我同时使用了新旧杰克逊库

    即在我有之前 import org.codehaus.jackson.annotate.JsonProperty; 我必须将其更改为以下内容,以与我使用的库保持一致。

    由于我使用的是 maven,这也意味着更新我的 maven 依赖项。 import com.fasterxml.jackson.annotation.JsonProperty;

    为了让它工作,我需要在 getter 上添加 @JsonProperty 注释(将它放在对象上不起作用)

    我在这里找到了答案(感谢 francescoforesti) @JsonProperty not working as expected

    【讨论】:

    • 我为此头疼了一天!谢谢你
    • 你可以在setter上使用@JsonSetter来更改prop名称,以查找var名称是否与json prop名称不一致。
    【解决方案4】:

    即使在定义了正确的注释之后,骆驼案例似乎仍然存在问题。 示例:

    @JsonProperty("镜像") 私有字符串 mirrorPort;

    当 xml 有 <mirrorport>YES</mirrorport> 时,反序列化仍然失败

    【讨论】:

      【解决方案5】:

      我也有同样的问题

      您只需要替换导入 导入 com.fasterxml.jackson.annotation.JsonProperty; 在 导入 org.codehaus.jackson.annotate.JsonProperty; 它的工作。

      【讨论】:

      • 非常感谢。这太疯狂了
      【解决方案6】:

      我最近在这个问题上遇到了另一个有趣的转折。我们开始使用 Hibernate5Module 来帮助解决一些延迟加载问题。此外,我们使用 Groovy,因此我们没有定义 getter 和 setter。

      事实证明,Hibernate 模块似乎干扰了@JsonProperty 注释。特别是如果你有 @Transient 注释的东西那么,如果你有类似的东西:

      @Transient
      @ApiModelProperty(required = true)
      @JsonProperty("alternateName")
      String property
      

      您不会在 JSON 中看到 alternateName。此外,您的客户可能会遇到他们的 POST 和 PUT 问题!要解决此问题,您可以使用简单的解决方法。为您需要使用的内部名称定义 getter 和 setter (*) 并且不要在 @JsonProperty 上使用 value 属性所以这行得通:

      @Transient
      @ApiModelProperty(required = true)
      @JsonProperty
      String alternateName
      
      void setProperty(String property) {
          this.alternateName = property
      }
      
      @JsonIgnore
      String getProperty() {
          this.alternateName
      }
      

      注意在 getter 上使用 @JsonIgnore。如果不这样做,您的框架可能会选择它,并且您的 JSON 中会出现相同内容的重复条目。

      无论如何 - 我希望这对某人有所帮助!

      (*)我们试图遵守特定的接口,因此在内部强制执行该名称。但是,公开的 API 需要一个不同的、用户友好的名称。

      【讨论】:

      • Michael,同样的问题,我们有hibernate bean,其中一个字段是trustedIpRanges,可以说CidrBlock的列表,然后我们有一个逻辑String属性称为trustedIpRangesString必须用于序列化。这里的问题是杰克逊没有调用getter方法,所以如果我们为String属性分配任何值,那么我们可以在结果中看到它,但是我们在没有调用的getter方法中构建了那个String。我被卡住了,任何帮助将不胜感激。
      【解决方案7】:

      从旧版本更新到 FasterXML Jackson 的 2.8.3 时,我遇到了这个问题。

      问题是在将来自我们的 DB 的 JSON 响应反序列化为 Java 类对象时,我们的代码在类的设置器上没有 @JsonSetter。因此,在序列化时,输出没有利用类的 getter 将 Java 类对象序列化为 JSON(因此 @JsonProperty() 装饰器没有生效)。

      我通过将@JsonSetter("name-from-db") 添加到该属性的setter 方法来解决此问题。

      另外,除了@JsonProperty(),要使用getter 方法重命名属性,您可以而且应该使用@JsonGetter(),它更具体地用于重命名属性。

      这是我们的代码:

      public class KwdGroup {
          private String kwdGroupType;
      
          // Return "type" instead of "kwd-group-type" in REST API response
          @JsonGetter("type") // Can use @JsonProperty("type") as well
          public String getKwdGroupType() {
              return kwdTypeMap.get(kwdGroupType);
          }
      
          @JsonSetter("kwd-group-type") // "kwd-group-type" is what JSON from the DB API outputs for code to consume 
          public void setKwdGroupType(String kwdGroupType) {
              this.kwdGroupType = kwdGroupType;
          }
      }
      

      【讨论】:

      • 互联网上唯一适用于新版杰克逊的答案
      【解决方案8】:

      我缺少数据绑定依赖项

      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>${fasterxml.version}</version>
      </dependency>
      

      【讨论】:

        【解决方案9】:

        我知道这是一个老问题,但对我来说,当我发现它与 Gson 库冲突时,我得到了它的工作,所以我不得不使用 @SerializedName("name") 而不是 @JsonProperty("name") 希望这会有所帮助

        【讨论】:

        • 这就是发生在我身上的事情,我在我的代码中同时使用了 Gson 和 Jackson 库并且发生了冲突。谢谢,这对我有用。
        • @user1607261 这两个导入是相同的
        【解决方案10】:

        如果使用 Kotlin

        我知道最初的问题是用 Java 编写的,但是由于 Kotlin 变得非常流行并且可能很多人都在使用它,所以我想在这里发布这个以帮助其他人。

        无论如何,对于 Kotlin,因为 getter/setter 是如何工作的,如果您使用 val,这意味着您只公开 getter,您可能需要将注解应用于 getter,如下所示:

        class JacksonTester(@get:JsonProperty("hello") val hi: String)
        
        

        【讨论】:

        • 这是 Java 和 Kotlin 之间非常重要的区别,正是我所需要的。
        • 我想知道为什么它不适用于我的 Kotlin 数据类,谢谢!
        • 如果您因此遇到错误,请确保您尝试将其应用于班级中的所有@JsonPropertys。此外,@field:JsonProperty 为我工作。
        【解决方案11】:

        试试这个

        class JacksonTester {
            private String hi;
        
            @JsonProperty("hi")
            public String getHi() {
                return hi;
            }
        } 
        

        【讨论】:

          猜你喜欢
          • 2012-12-14
          • 2014-05-05
          • 2014-11-12
          • 2020-06-22
          • 1970-01-01
          • 2013-06-15
          • 2015-07-30
          相关资源
          最近更新 更多