Custom Serializer и схема Джексона - PullRequest
       35

Custom Serializer и схема Джексона

1 голос
/ 24 октября 2019

У меня есть два следующих класса:

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"
    }
  }
}

Ноchilds должен быть не типа "any", а типа "object". Если я удаляю сериализатор, тип "объект". Нужно ли что-то добавить, чтобы генератор схемы знал об этом типе?

1 Ответ

1 голос
/ 25 октября 2019

Это работает после того, как я перезаписал acceptJsonFormatVisitor() в моем классе MapValueSerializer с помощью:

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

Тогда дочерний элемент имеет тип "объект", а также подэлемент "x" генерируется в схеме.

...