gpt4 book ai didi

java - 自定义序列化器和 jackson 模式

转载 作者:行者123 更新时间:2023-11-30 05:26:15 25 4
gpt4 key购买 nike

我有以下两个类(class):

public class MyChild
{
@JsonProperty
public int x;
}
public class MyTest
{
public void MyChild() {}

@JsonSerialize(using = MapValueSerializer.class)
private Map<String, MyChild> childs = new LinkedHashMap<>();
}

我希望子级序列化为 MyChild 数组而不是映射(仅值)。因此,我使用以下自定义序列化器:

public class MapValueSerializer extends StdSerializer<Map<String, ?>>
{

protected MapValueSerializer()
{
this(null);
}

protected MapValueSerializer(Class<Map<String, ?>> t)
{
super(t);
}

@Override
public void serialize(Map<String, ?> value, JsonGenerator gen, SerializerProvider provider) throws IOException
{
provider.defaultSerializeValue(value.values(), gen);
}
}

当我现在使用 JsonSchemaGeneratorMyTest 生成架构时,我得到以下结果:

{
"type" : "object",
"id" : "urn:jsonschema:com:myclasses:MyTest",
"properties" : {
"childs" : {
"type" : "any"
}
}
}

但是子项不应该是“any”类型,而应该是“object”类型。如果我删除序列化器,则类型为“对象”。我是否必须添加一些内容才能使架构生成器识别该类型?

最佳答案

在我的 MapValueSerializer 类中用以下内容覆盖 acceptJsonFormatVisitor() 后,它就可以工作了:

@Override
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException
{
JavaType valueType = ((MapType) typeHint).getContentType();
visitor.getProvider().findValueSerializer(valueType).acceptJsonFormatVisitor(visitor, valueType);
}

然后 child 的类型为“object”,并且子元素“x”也在架构中生成。

关于java - 自定义序列化器和 jackson 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540102/

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