Skip to content

Commit d323ba6

Browse files
committed
Implement Json decoding using streaming API
1 parent 63a57d3 commit d323ba6

File tree

5 files changed

+33
-2
lines changed

5 files changed

+33
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package retrofit2.converter.kotlinx.serialization.json
22

3+
import kotlinx.serialization.ExperimentalSerializationApi
34
import kotlinx.serialization.json.Json
45
import okhttp3.MediaType
56
import retrofit2.Converter
67
import retrofit2.converter.kotlinx.serialization.Factory
7-
import retrofit2.converter.kotlinx.serialization.Serializer
88

99
/**
1010
* Return a [Converter.Factory] which uses Kotlin serialization for Json-based payloads.
@@ -13,8 +13,9 @@ import retrofit2.converter.kotlinx.serialization.Serializer
1313
* that it can handle all types. If you are mixing this with something else, you must add this
1414
* instance last to allow the other converters a chance to see their types.
1515
*/
16+
@ExperimentalSerializationApi
1617
@JvmName("create")
1718
fun Json.asConverterFactory(): Converter.Factory {
1819
val contentType = MediaType.get("application/json; charset=UTF-8")
19-
return Factory(contentType, Serializer.FromString(this))
20+
return Factory(contentType, SerializerFromJson(this))
2021
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package retrofit2.converter.kotlinx.serialization.json
2+
3+
import kotlinx.serialization.DeserializationStrategy
4+
import kotlinx.serialization.ExperimentalSerializationApi
5+
import kotlinx.serialization.SerializationStrategy
6+
import kotlinx.serialization.json.Json
7+
import kotlinx.serialization.json.decodeFromStream
8+
import okhttp3.MediaType
9+
import okhttp3.RequestBody
10+
import okhttp3.ResponseBody
11+
import retrofit2.converter.kotlinx.serialization.Serializer
12+
13+
@ExperimentalSerializationApi
14+
class SerializerFromJson(override val format: Json) : Serializer() {
15+
override fun <T> fromResponseBody(loader: DeserializationStrategy<T>, body: ResponseBody): T {
16+
val stream = body.byteStream()
17+
return format.decodeFromStream(loader, stream)
18+
}
19+
20+
override fun <T> toRequestBody(contentType: MediaType, saver: SerializationStrategy<T>, value: T): RequestBody {
21+
val string = format.encodeToString(saver, value)
22+
return RequestBody.create(contentType, string)
23+
}
24+
}

retrofit-converters/kotlinx-serialization-json/src/test/java/retrofit2/converter/kotlinx/serialization/json/KotlinxJsonSerializationConverterFactoryContextualListTest.kt

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package retrofit2.converter.kotlinx.serialization.json
22

3+
import kotlinx.serialization.ExperimentalSerializationApi
34
import kotlinx.serialization.KSerializer
45
import kotlinx.serialization.Serializable
56
import kotlinx.serialization.descriptors.PrimitiveKind
@@ -21,6 +22,7 @@ import retrofit2.http.Body
2122
import retrofit2.http.GET
2223
import retrofit2.http.POST
2324

25+
@OptIn(ExperimentalSerializationApi::class)
2426
class KotlinxJsonSerializationConverterFactoryContextualListTest {
2527
@get:Rule
2628
val server = MockWebServer()

retrofit-converters/kotlinx-serialization-json/src/test/java/retrofit2/converter/kotlinx/serialization/json/KotlinxSerializationJsonConverterFactoryContextualTest.kt

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package retrofit2.converter.kotlinx.serialization.json
22

3+
import kotlinx.serialization.ExperimentalSerializationApi
34
import kotlinx.serialization.KSerializer
45
import kotlinx.serialization.Serializable
56
import kotlinx.serialization.descriptors.PrimitiveKind
@@ -21,6 +22,7 @@ import retrofit2.http.Body
2122
import retrofit2.http.GET
2223
import retrofit2.http.POST
2324

25+
@OptIn(ExperimentalSerializationApi::class)
2426
class KotlinxSerializationJsonConverterFactoryContextualTest {
2527
@get:Rule
2628
val server = MockWebServer()

retrofit-converters/kotlinx-serialization-json/src/test/java/retrofit2/converter/kotlinx/serialization/json/KotlinxSerializationJsonConverterFactoryTest.kt

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package retrofit2.converter.kotlinx.serialization.json
22

3+
import kotlinx.serialization.ExperimentalSerializationApi
34
import kotlinx.serialization.Serializable
45
import kotlinx.serialization.json.Json
56
import okhttp3.mockwebserver.MockResponse
@@ -14,6 +15,7 @@ import retrofit2.http.Body
1415
import retrofit2.http.GET
1516
import retrofit2.http.POST
1617

18+
@OptIn(ExperimentalSerializationApi::class)
1719
class KotlinxSerializationJsonConverterFactoryTest {
1820
@get:Rule val server = MockWebServer()
1921

0 commit comments

Comments
 (0)