SchemaSerializer.java

package io.swagger.v3.core.jackson;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ResolvableSerializer;
import io.swagger.v3.oas.models.media.Schema;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;

public class SchemaSerializer extends JsonSerializer<Schema> implements ResolvableSerializer {

    private JsonSerializer<Object> defaultSerializer;

    public SchemaSerializer(JsonSerializer<Object> serializer) {
        defaultSerializer = serializer;
    }

    @Override
    public void resolve(SerializerProvider serializerProvider) throws JsonMappingException {
        if (defaultSerializer instanceof ResolvableSerializer) {
            ((ResolvableSerializer) defaultSerializer).resolve(serializerProvider);
        }
    }

    @Override
    public void serialize(
            Schema value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException {

        if (StringUtils.isBlank(value.get$ref())) {

            boolean hasNullExample = value.getExampleSetFlag() && value.getExample() == null;
            boolean hasNullDefault = value.getDefaultSetFlag() && value.getDefault() == null;
            
            if (hasNullExample || hasNullDefault) {
                jgen.writeStartObject();
                defaultSerializer.unwrappingSerializer(null).serialize(value, jgen, provider);
                if (hasNullExample) {
                    jgen.writeNullField("example");
                }
                if (hasNullDefault) {
                    jgen.writeNullField("default");
                }
                jgen.writeEndObject();
            } else {
                defaultSerializer.serialize(value, jgen, provider);
            }

        } else {
            // handle ref schema serialization skipping all other props
            jgen.writeStartObject();
            jgen.writeStringField("$ref", value.get$ref());
            jgen.writeEndObject();
        }
    }
}