Andrej Kovar
11/10/2025, 12:01 PMAndrej Kovar
11/10/2025, 12:08 PMdecodeApiResponse implementationjw
11/10/2025, 2:29 PMAndrej Kovar
11/10/2025, 2:40 PMjw
11/10/2025, 2:41 PMAndrej Kovar
11/10/2025, 2:51 PMsuspend inline fun <reified T : Any> decodeApiResponseFromString(
json: Json,
response: HttpResponse,
): ApiResponseResult<T> {
return try {
val bodyAsString = response.bodyAsText()
val responseData = json.decodeFromString<T>(bodyAsString)
ApiResponseResult.Success(responseData)
} catch (e: Exception) {
ApiResponseResult.Failure(ApiFailure.ApiParsingError())
}
}
Or?
suspend inline fun <reified T : Any> decodeApiResponseFromChannel(
json: Json,
response: HttpResponse,
): ApiResponseResult<T> {
return try {
val source = response.bodyAsChannel().asSource().buffered()
val responseData = json.decodeFromSource<T>(source)
ApiResponseResult.Success(responseData)
} catch (e: Exception) {
ApiResponseResult.Failure(ApiFailure.ApiParsingError())
}
}Michael Krussel
11/10/2025, 6:25 PMNSInputStream used NSJSONSerialization.JSONObjectWithStream to decode, and then delete the file when done. I had to move the file also after the download, because NSUrlSession would delete it from under me.Andrej Kovar
11/10/2025, 9:40 PMConverter.Factory but we see difference in performances (heap size spike).ursus
11/11/2025, 12:11 AMAndrej Kovar
11/11/2025, 12:47 PMursus
11/11/2025, 2:02 PMAndrej Kovar
11/11/2025, 10:11 PM```suspend inline fun <reified T : Any> decodeApiResponse(
response: HttpResponse,
): T? {
return try {
response.body<T>()
} catch (e: CancellationException) {
throw e
} catch (e: Exception) {
Logger.e("decodeApiResponse", e)
null
}
}```We have a use case where 10 REST calls are executed in parallel and each of them is returning 1-2MB of JSON data.
ursus
11/11/2025, 10:21 PMursus
11/11/2025, 10:24 PM