interface ContentConverter

A custom content converted that could be registered in ContentNegotiation feature for any particular content type Could provide bi-directional conversion implementation. One of the most typical examples of content converter is a json content converter that provides both serialization and deserialization



abstract suspend fun convertForReceive(
    context: PipelineContext<ApplicationReceiveRequest, ApplicationCall>
): Any?

Convert a value (RAW or intermediate) from receive pipeline (deserialize). Pipeline PipelineContext.subject has ApplicationReceiveRequest.value of type ByteReadChannel


abstract suspend fun convertForSend(
    context: PipelineContext<Any, ApplicationCall>,
    contentType: ContentType,
    value: Any
): Any?

Convert a value to the specified contentType to a value suitable for sending (serialize). Note that as far as ContentConverter could be registered multiple times with different content types hence contentType could be different depends on what the client accepts (inferred from Accept header). This function could ignore value if it is not suitable for conversion and return null so in this case other registered converters could be tried or this function could be invoked with other content types it the converted has been registered multiple times with different content types



class GsonConverter : ContentConverter

GSON converter for ContentNegotiation feature


class JacksonConverter : ContentConverter
    install(ContentNegotiation) {
       register(ContentType.Application.Json, JacksonConverter())

    to be able to modify the objectMapper (eg. using specific modules and/or serializers and/or
    configuration options, you could use the following (as seen in the ktor-samples):

    install(ContentNegotiation) {
        jackson {
            configure(SerializationFeature.INDENT_OUTPUT, true)


class SerializationConverter : ContentConverter

Json ContentConverter with kotlinx.serialization.