Jackson 未使用 @JsonProperty 覆盖 Getter

Jackson Not Overriding Getter with @JsonProperty

JsonProperty 并未覆盖 jackson 从 getter 获得的默认名称。如果我用 ObjectMapper 和 jackson 序列化下面的 class 我得到

{"hi":"hello"}

如您所见,JsonProperty 注释无效

class JacksonTester {
    String hi;

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

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

将始终为小写

放在变量上,而不是 getter

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

    public String getHi() {
        return hi;
    }
} 

下面你试过了吗

class JacksonTester {
    private String hi;

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

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

问题是我同时使用了旧的和新的 jackson 库

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

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

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

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

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

@JsonProperty("mirrorport") 私有字符串镜像端口;

当xml有<mirrorport>YES</mirrorport>

时反序列化仍然失败

我有同样的问题

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

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

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

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

您不会在 JSON 中看到 alternateName。此外,您的客户可能会遇到他们的 POST 和 PUT 问题!要解决此问题,您可以使用一个简单的解决方法。为您需要使用的内部名称定义 getters 和 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 需要一个不同的、用户友好的名称。

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

问题是在将来自我们数据库的 JSON 响应反序列化为 Java class 对象时,我们的代码在 [=28= 上没有 @JsonSetter ]' setters。因此,在序列化时,输出没有利用 class' getters 将 Java class 对象序列化为 JSON(因此 @JsonProperty()装饰器没有生效)。

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

此外,要使用 getter 方法重命名属性,您可以而且应该使用 @JsonGetter(),而不是 @JsonProperty(),它更适合重命名属性。

这是我们的代码:

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;
    }
}

我缺少数据绑定依赖项

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

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

如果使用 Kotlin

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

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

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

试试这个

class JacksonTester {
    private String hi;

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