Jackson 没有使用 @JsonProperty 覆盖 Getter

问题描述 投票:0回答:13

JsonProperty
不会覆盖 jackson 从 getter 获取的默认名称。如果我用
ObjectMapper
和 Jackson 序列化下面的类,我会得到

{"hi":"hello"}

可以看到 JsonProperty 注解没有效果

class JacksonTester {
    String hi;

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

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

java json serialization jackson getter
13个回答
70
投票

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

即在我之前

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

由于我使用了 Maven,这也意味着更新我的 Maven 依赖项。

import com.fasterxml.jackson.annotation.JsonProperty;

为了让它工作,我需要在 getter 上添加

@JsonProperty
注释(将它放在对象上不起作用)

我在这里找到了答案(感谢francescoforesti) @JsonProperty 未按预期工作


40
投票

如果使用 Kotlin

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

无论如何,对于 Kotlin 来说,因为 getter/setter 的工作方式,如果您使用

val
,意味着您只公开 getter,您可能需要将注释应用到 getter,如下所示:

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


29
投票

我知道这是一个老问题,但对我来说,当我发现它与 Gson 库冲突时,我就开始工作了,所以我不得不使用

@SerializedName("name")
而不是
@JsonProperty("name")
希望这会有所帮助


7
投票

我也有同样的问题

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


6
投票

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

问题是当将来自数据库的 JSON 响应反序列化为 Java 类对象时,我们的代码在类的 setter 上没有

@JsonSetter
。因此,在序列化时,输出没有利用类的 getter 将 Java 类对象序列化为 JSON(因此
@JsonProperty()
装饰器没有生效)。

我通过将

@JsonSetter("name-from-db")
添加到该属性的 setter 方法中解决了该问题。

此外,要使用 getter 方法重命名属性,您可以而且应该使用

@JsonProperty()
,而不是
@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;
    }
}

2
投票

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

事实证明,Hibernate 模块似乎干扰了

@JsonProperty
注释。具体来说,如果您有一些带有
@Transient
注释的内容,那么,如果您有类似的内容:

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

您不会在 JSON 中看到

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

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

void setProperty(String property) {
    this.alternateName = property
}

@JsonIgnore
String getProperty() {
    this.alternateName
}

注意吸气剂上

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

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

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


1
投票

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

@JsonProperty(“镜像端口”) 私有字符串镜像端口;

当 xml 有

<mirrorport>YES</mirrorport>

时反序列化仍然失败

1
投票

我缺少数据绑定依赖项

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

0
投票

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

class JacksonTester {
    @JsonProperty("hello")
    private String hi;

    public String getHi() {
        return hi;
    }
} 

0
投票

您尝试过以下吗

class JacksonTester {
    private String hi;

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

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


0
投票

我也有同样的问题, 当我同时使用 com.fasterxml.jackson.core 和 com.google.code.gson:gson 时,就会发生这种情况

我解决了使用 gson.annotations

@SerializedName("enum")
而不是 fastxml 附带的
@JsonProperty("enum")

谢谢


0
投票

我遇到了同样的问题,@JsonProperty 不起作用。我没有任何旧版本的 jackson 库,也没有任何 gson 库,因为这似乎是其他答案中提到的问题。

这是因为我的代码使用了错误的 JSON 序列化器,该序列化器不关心 JsonProperty 注释。它使用的是雅加达。为了强制它使用jackson进行反序列化,我添加了以下代码-

ObjectMapper objectMapper = new ObjectMapper();
MyObject myObject = objectMapper.convertValue(value, MyObject.class); 
// value can be your json string or Object

我在评论中找到了我的具体问题的答案 - @JsonProperty 不起作用(Weblogic 12.2.1 和 Java 8)


-3
投票

试试这个

class JacksonTester {
    private String hi;

    @JsonProperty("hi")
    public String getHi() {
        return hi;
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.