Skip to content

Commit

Permalink
Implement Json decoding using streaming API
Browse files Browse the repository at this point in the history
  • Loading branch information
0neel committed Jun 8, 2024
1 parent 63a57d3 commit d323ba6
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package retrofit2.converter.kotlinx.serialization.json

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
import okhttp3.MediaType
import retrofit2.Converter
import retrofit2.converter.kotlinx.serialization.Factory
import retrofit2.converter.kotlinx.serialization.Serializer

/**
* Return a [Converter.Factory] which uses Kotlin serialization for Json-based payloads.
Expand All @@ -13,8 +13,9 @@ import retrofit2.converter.kotlinx.serialization.Serializer
* that it can handle all types. If you are mixing this with something else, you must add this
* instance last to allow the other converters a chance to see their types.
*/
@ExperimentalSerializationApi
@JvmName("create")
fun Json.asConverterFactory(): Converter.Factory {
val contentType = MediaType.get("application/json; charset=UTF-8")
return Factory(contentType, Serializer.FromString(this))
return Factory(contentType, SerializerFromJson(this))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package retrofit2.converter.kotlinx.serialization.json

import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream
import okhttp3.MediaType
import okhttp3.RequestBody
import okhttp3.ResponseBody
import retrofit2.converter.kotlinx.serialization.Serializer

@ExperimentalSerializationApi
class SerializerFromJson(override val format: Json) : Serializer() {
override fun <T> fromResponseBody(loader: DeserializationStrategy<T>, body: ResponseBody): T {
val stream = body.byteStream()
return format.decodeFromStream(loader, stream)
}

override fun <T> toRequestBody(contentType: MediaType, saver: SerializationStrategy<T>, value: T): RequestBody {
val string = format.encodeToString(saver, value)
return RequestBody.create(contentType, string)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package retrofit2.converter.kotlinx.serialization.json

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
Expand All @@ -21,6 +22,7 @@ import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST

@OptIn(ExperimentalSerializationApi::class)
class KotlinxJsonSerializationConverterFactoryContextualListTest {
@get:Rule
val server = MockWebServer()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package retrofit2.converter.kotlinx.serialization.json

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
Expand All @@ -21,6 +22,7 @@ import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST

@OptIn(ExperimentalSerializationApi::class)
class KotlinxSerializationJsonConverterFactoryContextualTest {
@get:Rule
val server = MockWebServer()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package retrofit2.converter.kotlinx.serialization.json

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import okhttp3.mockwebserver.MockResponse
Expand All @@ -14,6 +15,7 @@ import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST

@OptIn(ExperimentalSerializationApi::class)
class KotlinxSerializationJsonConverterFactoryTest {
@get:Rule val server = MockWebServer()

Expand Down

0 comments on commit d323ba6

Please sign in to comment.