如果属性名称不等于字段名称,则Jackson @JsonProperty无效

时间:2016-10-17 19:14:17

标签: java json annotations jackson

我有以下JSON

2016-01-03

和绑定类

{
  "known-name": "Zevs",
  "approximate-age": 320
}

跟随maven依赖                 2.23.2           2.5.4      

public class GodBinding {

  @JsonProperty("known-name")
  public String name;

  @JsonProperty("approximate-age")
  public int age;

  // constructors
  // getters & setters
}

如果我发布这样的json,那么我有null的意外结果。

 <dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey.version}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>${jackson.version}</version>
    </dependency>
 </dependencies>

如果我使用没有名称的@JsonProperty并发送JSON,其中属性名称等于字段名称

GodBinding [name=null, age=0]

然后它工作正常

{
  "name": "Zevs",
  "age": 320
}

如果有人知道,如何在字段上正常运行@JsonProperty(“name”)?

3 个答案:

答案 0 :(得分:0)

你应该把它添加到你的POM

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.4.4</version>
</dependency>

您可以看到示例here

答案 1 :(得分:0)

这通常是由杰克逊1的注解是杰克逊1引起的,但是您要使用杰克逊2,就像其他许多问题中提到的那样。

就我而言,在项目中,我还有另一个依赖关系,该依赖关系被错误地导入:

import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper;

当我创建ObjectMapper时。我猜testcontainers使用自己的ObjectMapper作为其依赖项,并且错误地公开了它。实际上它是一个较旧的版本。不确定是哪个。

我将其更改为

import com.fasterxml.jackson.databind.ObjectMapper;

,现在所有的作品。这就是我所说的“第一级依赖关系”,而不是“依赖关系的依赖关系”。在我的gradle文件中,它是2.3版。

我之所以这样提及,是因为:

  • 我看到其他问题只提到杰克逊1和2之间的困惑,而不是testcontainer的困惑。我们只是必须忽略那些fasterxml.jackson以外的那些。

  • 不仅要注意@JsonProperty等版本,还要注意导入ObjectMapperDeserializationFeature时使用的Jackson版本。

答案 2 :(得分:0)

仅供参考,我通过显式导入com.fasterxml.jackson.core:jackson-databind:2.9.9而不是使用其他包间接导入的ObjectMapper 来解决此问题。


提示:

  1. 导入正确的依赖项;
  2. 从正确的依赖项导入;