杰克逊没有用@JsonProperty覆盖吸气剂

时间:2015-09-29 11:45:18

标签: java json serialization jackson getter

JsonProperty不会覆盖杰克逊从getter获取的默认名称。如果我使用ObjectMapper和杰克逊序列化下面的课程,我会得到

{"hi":"hello"}

如您所见,JsonProperty注释无效

class JacksonTester {
    String hi;

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

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

11 个答案:

答案 0 :(得分:23)

问题在于我正在使用旧的和新的杰克逊库

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

因为我使用maven也意味着更新我的maven依赖项。 import com.fasterxml.jackson.annotation.JsonProperty;

要使它工作,我需要在getter上使用@JsonProperty注释(将它放在对象上不起作用)

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

答案 1 :(得分:3)

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

问题在于,当我们将数据库中的JSON响应反序列化为Java类对象时,我们的代码在类中没有@JsonSetter。 setter方法。因此,在序列化时,输出不是利用类#39; 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 :(得分:2)

我有同样的问题

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

答案 3 :(得分:2)

我知道这是一个老问题,但是当我发现它与Gson库冲突时,对我来说我可以使用它,所以我不得不使用scnnode而不是UIPanGestureRecognizer希望对您有所帮助

答案 4 :(得分:1)

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

@JsonProperty( “mirrorport”)  private String mirrorPort;

当xml具有<mirrorport>YES</mirrorport>

时,反序列化仍然失败

答案 5 :(得分:0)

将它放在变量上,而不是放置器

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

    public String getHi() {
        return hi;
    }
} 

答案 6 :(得分:0)

你试过下面的

class JacksonTester {
    private String hi;

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

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

答案 7 :(得分:0)

我最近在这个问题上遇到了另一个有趣的转折点。我们开始使用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
}

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

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

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

答案 8 :(得分:0)

我缺少数据绑定依赖项

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

答案 9 :(得分:0)

如果使用Kotlin

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

无论如何,对于Kotlin而言,因为吸气剂/塞特剂的工作方式,如果您使用的是val,这意味着您仅公开吸气剂,则可能需要像下面这样将注释应用于吸气剂:

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

答案 10 :(得分:0)

尝试一下

class JacksonTester {
    private String hi;

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