【问题标题】:Jackson Deserialize and Serialize with different field name杰克逊反序列化和序列化具有不同的字段名称
【发布时间】:2020-11-30 09:42:50
【问题描述】:

我有一个类,我想用 Jackson 反序列化和序列化。目前这就是我所拥有的

class Person {
    @JsonAlias("fullName")
    @JsonDeserialize(using = NameDeserializer.class)
    String name;
}

我希望能够读取{"fullName": "John Doe"} 并写入{"name": "John Doe"}

我也在使用 Lombok 来创建 setter 和 getter,所以我不能在方法级别使用 @JsonProperty。知道我将如何处理这个问题,因为目前看来@JsonAlias 似乎没有按预期工作。我正在使用 Jackson 2.10 来映射对象。

编辑

原来使用 Alias 效果很好。虽然在第一次弄清楚它是如何不起作用的时,我重写了 lombok setter

@JsonProperty("firstName")
public void setName(String name){
    this.name = name;
}

从这里我发现我的反序列化器实际上是问题所在。

【问题讨论】:

  • 你可以显式编写setter getter(不用担心lombok没有问题)并在它们上使用@JsonProperty
  • 除了重写setter还有其他解决方案吗?

标签: java json serialization jackson deserialization


【解决方案1】:

只需删除自定义反序列化器,并使用 @JsonProperty 注释该字段,这应该可以使您的方案工作:

class Person {
    @JsonAlias("fullName")
    @JsonProperty
    String name;
}

自定义反序列化器控制反序列化的完成方式,这就是别名可能被忽略的地方。

【讨论】:

  • 根据docsJsonAlias“在始终使用主名称的序列化过程中无效”,所以是的,它序列化为name,但可以从fullName反序列化。
  • 我实际上需要自定义反序列化器,因为我需要一些修改。
  • 然后你可以在反序列化代码中考虑别名。这不可行吗?然后你会删除JsonAlias
【解决方案2】:

您可以将 JsonProperty 注释与属性一起使用,因为它写在这里 https://github.com/FasterXML/jackson-annotations

public class Name {
    @JsonProperty("firstName")
    public String _first_name;
}

【讨论】:

  • 我想将其序列化为名称,因此无法使用 JsonProperty
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2016-07-11
  • 2012-12-12
相关资源
最近更新 更多