自定义序列化程序和 Jackson Schema
Custom Serializer and Jackson Schema
我有以下两个类:
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);
}
}
当我现在使用 JsonSchemaGenerator
从 MyTest
生成模式时,我得到以下信息:
{
"type" : "object",
"id" : "urn:jsonschema:com:myclasses:MyTest",
"properties" : {
"childs" : {
"type" : "any"
}
}
}
但是孩子不应该是 "any" 类型,而是 "object" 类型。如果我删除序列化程序,则类型为 "object"。我是否必须添加一些内容才能使模式生成器识别该类型?
在我用 MapValueSerializer
class 覆盖 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" 也在架构中生成。
我有以下两个类:
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);
}
}
当我现在使用 JsonSchemaGenerator
从 MyTest
生成模式时,我得到以下信息:
{
"type" : "object",
"id" : "urn:jsonschema:com:myclasses:MyTest",
"properties" : {
"childs" : {
"type" : "any"
}
}
}
但是孩子不应该是 "any" 类型,而是 "object" 类型。如果我删除序列化程序,则类型为 "object"。我是否必须添加一些内容才能使模式生成器识别该类型?
在我用 MapValueSerializer
class 覆盖 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" 也在架构中生成。