如果属性名称不等于字段名称,则Jackson @JsonProperty无法正常工作

can*_*ane 5 java json annotations jackson

我有以下JSON

{
  "known-name": "Zevs",
  "approximate-age": 320
}
Run Code Online (Sandbox Code Playgroud)

和绑定类

public class GodBinding {

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

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

  // constructors
  // getters & setters
}
Run Code Online (Sandbox Code Playgroud)

和后续的Maven依赖关系2.23.2 2.5.4

 <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>
Run Code Online (Sandbox Code Playgroud)

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

GodBinding [name=null, age=0]
Run Code Online (Sandbox Code Playgroud)

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

{
  "name": "Zevs",
  "age": 320
}
Run Code Online (Sandbox Code Playgroud)

然后就可以了

GodBinding [name=Zevs, age=320]
Run Code Online (Sandbox Code Playgroud)

如果有人知道,如何使@JsonProperty(“ name”)在正常工作的字段上?

Wes*_*Gun 5

当Jackson的注释是Jackson 1,但你想使用Jackson 2时,通常会导致这种情况,正如许多其他问题中提到的那样。

就我而言,在项目中我有另一个错误导入的依赖项:

import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper;
Run Code Online (Sandbox Code Playgroud)

当我创建ObjectMapper. 我猜想testcontainers使用它自己ObjectMapper作为它的依赖并错误地暴露它;实际上它是一个旧版本。不确定哪个是。

我把它改成

import com.fasterxml.jackson.databind.ObjectMapper;
Run Code Online (Sandbox Code Playgroud)

现在一切正常。这就是我所说的“第一级依赖”,而不是“依赖的依赖”。在我的 gradle 文件中,它是 2.3 版。

我提到这一点是因为:

  • 我看到其他问题只提到了 Jackson 1 和 2 之间的混淆,而不是testcontainer. 我们必须忽略那些不属于fasterxml.jackson.

  • 不仅要注意 等的版本@JsonProperty还要注意导入ObjectMapper和时使用的Jackson 的版本DeserializationFeature


小智 0

你应该将其添加到你的 POM 中

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.4.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到一个例子