【问题标题】:Jackson @JsonProperty not working if property name not equal field name如果属性名称不等于字段名称,Jackson @JsonProperty 不起作用
【发布时间】:2016-10-17 19:14:16
【问题描述】:

我有以下 JSON

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

和绑定类

public class GodBinding {

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

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

  // constructors
  // getters & setters
}

并遵循 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>

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

GodBinding [name=null, age=0]

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

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

然后它工作正常

GodBinding [name=Zevs, age=320]

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

【问题讨论】:

  • @JsonProperty("anyname") 注释忽略任何给定名称并尝试仅按字段名称绑定数据。
  • 所提供的解决方案都没有帮助我。使用杰克逊版本 2.9.4。注释不起作用的其他原因可能是什么?

标签: java json annotations jackson


【解决方案1】:

这通常是由于 Jackson 的注释是 Jackson 1,但您想使用 Jackson 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等的版本,还要注意你在导入ObjectMapper和DeserializationFeature时使用的Jackson版本。

【讨论】:

  • 这也是我的问题
【解决方案2】:

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


提示:

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

【讨论】:

    【解决方案3】:

    你应该把它添加到你的 POM 中

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

    你可以看一个例子here

    【讨论】:

    • jackson-databind 已经是因为 jackson-jaxrs-json-provider。
    • 对于给定的示例,您具有相同的 json 属性名称和对象字段名称。例如姓名或姓氏。这就是为什么 - 没问题。
    • 不,如果 jackson 被暴露为其他依赖项的依赖项,它可能是一个错误的版本,它可能无法工作,这是我的情况。我们应该只使用fasterxml.jackson。看我的回答。
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2012-08-21
    • 2018-02-06
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多