是否可能:在类中有一个字段,但在Jackson库的序列化/反序列化过程中有不同的名称?

例如,我有"Coordiantes"课程.

class Coordinates{
  int red;
}

要从JSON进行反序列化,请使用以下格式:

{
  "red":12
}

但当我序列化对象时,结果应该是这样的:

{
  "r":12
}

我试图通过在getter和setter上应用@JsonProperty注释(使用不同的值)来实现这一点:

class Coordiantes{
    int red;

    @JsonProperty("r")
    public byte getRed() {
      return red;
    }

    @JsonProperty("red")
    public void setRed(byte red) {
      this.red = red;
    }
}

但我有个例外:

组织.科德豪斯.杰克逊. map exc.UnrecognizedPropertyException:未识别字段"红色"

推荐答案

刚刚经过测试,效果良好:

public class Coordinates {
    byte red;

    @JsonProperty("r")
    public byte getR() {
      return red;
    }

    @JsonProperty("red")
    public void setRed(byte red) {
      this.red = red;
    }
}

其 idea 是方法名称应该不同,因此jackson将其解析为不同的字段,而不是一个字段.

以下是测试代码:

Coordinates c = new Coordinates();
c.setRed((byte) 5);

ObjectMapper mapper = new ObjectMapper();
System.out.println("Serialization: " + mapper.writeValueAsString(c));

Coordinates r = mapper.readValue("{\"red\":25}",Coordinates.class);
System.out.println("Deserialization: " + r.getR());

结果:

Serialization: {"r":5}
Deserialization: 25

Java相关问答推荐

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

最小拓Flutter 排序的时间复杂度是多少?

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

如何修复IndexOutOfBoundsException在ClerView适配器的onRowMoved函数?

Spark忽略Iceberg Nessie目录

将java.util.Date转换为OffsetDateTime

如何仅使用键/ID的一部分(组合)高效地返回映射值?

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

如何在JavaFX中制作鼠标透明stage

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

如何在太阳系模拟器中添加月球?

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

Java组件项目中的JavaFX对话框国际化

在Oracle db中,当我们提供字符串而不是数字时,比较是如何工作的?

有没有办法知道在合并中执行了什么操作?

在ECLIPSE上的M1 Pro上运行JavaFX的问题

Java 21内置http客户端固定运营商线程

Intellij 2023 IDE:始终在顶部显示菜单栏

转换为JSON字符串时,日期按天递减-Java