gpt4 book ai didi

java - 为什么 Jackson 要将相同的 JSON 键/值写入两次?

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:29 25 4
gpt4 key购买 nike

我对 Jackson 进行了以下设置:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = Sub1.class, name = "sub1"),
@Type(value = Sub2.class, name = "sub2")
})
abstract class BaseClass {
private String type;

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}
}

例如,Sub1 看起来像这样:

public class Sub1 extends BaseClass {
String other;

public String getOther() {
return other;
}

public void setOther(String o) {
other = o;
}
}

该设置基本上是为了允许解析包含不同类型嵌入元素的 json 文档。解析有效,但是当我想写出 Sub1 实例时,奇怪的是,“type”键被写入生成的 JSON 中两次:

ObjectMapper mapper = new ObjectMapper();
Sub1 d = new Sub1();
d.setType("sub1");

mapper.writerFor(Sub1.class).writeValue(System.out, d);

我得到的输出是:{“类型”:“sub1”,“类型”:“sub1”,“其他”:null}

经过一些实验,似乎“类型”条目之一是由

引起的
@Type(value = Sub1.class, name = "sub1")

而另一个来自“type”属性。显然我只需要 JSON 中的“类型”条目。有谁知道如何防止这种情况,还是我做错了什么?

最佳答案

我也有类似的问题。似乎有效的修复方法是使用

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type")

相反,即使用 JsonTypeInfo.As.EXISTING_PROPERTYinclude。这使得 jackson 使用 AsExistingPropertyTypeSerializer ,如果您跟踪到 TypeSerializer#typeId(Object value, JsonToken valueShape)在 Jackson 的代码中,您会看到这使得序列化器期望该属性可作为常规 POJO 属性使用,因为它使用 WritableTypId.Inclusion.PAYLOAD_PROPERTY在这种情况下。

关于java - 为什么 Jackson 要将相同的 JSON 键/值写入两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43119156/

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