gpt4 book ai didi

java - Jackson 使用可选字段的默认值反序列化记录

转载 作者:行者123 更新时间:2023-12-05 03:23:58 34 4
gpt4 key购买 nike

假设一个具有多个可选字段的 JSON 结构。通过类,你可以做类似的事情

    public static final class Foo {
@JsonProperty("x")
private int x = 1;

@JsonProperty("y")
private int y = 2;

@JsonProperty("z")
private int z = 3;

}

它定义字段的默认值,以防它不存在于提供的 json 中。这也可以用记录来完成吗?

    public record Foo(int x, int y, int z) {

}

构造函数重载显然不是一个选项,据我所知你只能有一个 @JsonCreator 注释。

自定义反序列化器应该可以解决这个问题,但是还有其他方法吗,比如在 json 中未提供记录的情况下提供默认值以在记录的构造函数中使用的注释?

最佳答案

Jackson 不支持为空值定义默认值。
没有设置默认值的注解。
您只能在java类级别设置默认值。
有开Jackson issue用于该功能。

解决方案 是只定义一个具有属性初始化逻辑的构造函数,以防空值。记录是不可变的,字段填充仅通过构造函数执行。只有在构造函数中,您才能为记录字段定义默认值。

public record Foo(Integer x, Integer y, Integer z) {
public Foo(Integer x, Integer y, Integer z) {
this.x = x == null ? 1 : x;
this.y = y == null ? 2: y;
this.z = z == null ? 3: z;
}
}

单元测试:

    @Test
public void test() throws Exception {
int xDefault = 1;
int yDefault = 2;
int zDefault = 3;

String json = "{ \"x\": 11, \"y\":22, \"z\":33 }";
ObjectMapper objectMapper = new ObjectMapper();
Foo foo = objectMapper.reader().readValue(json, Foo.class);

Assert.assertEquals(11, (int) foo.x());
Assert.assertEquals(22, (int) foo.y());
Assert.assertEquals(33, (int) foo.z());

String json2 = "{ \"x\": 11, \"y\":22}";
Foo foo2 = objectMapper.reader().readValue(json2, Foo.class);

Assert.assertEquals(11, (int) foo2.x());
Assert.assertEquals(22, (int) foo2.y());
Assert.assertEquals(zDefault, (int) foo2.z());

String json3 = "{ }";
Foo foo3 = objectMapper.reader().readValue(json3, Foo.class);

Assert.assertEquals(xDefault, (int) foo3.x());
Assert.assertEquals(yDefault, (int) foo3.y());
Assert.assertEquals(zDefault, (int) foo3.z());
}

关于java - Jackson 使用可选字段的默认值反序列化记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72404561/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com