11package com.lagradost.cloudstream3.utils
22
3+ import com.fasterxml.jackson.core.type.TypeReference
34import com.fasterxml.jackson.module.kotlin.readValue
45import com.lagradost.cloudstream3.InternalAPI
56import com.lagradost.cloudstream3.json
@@ -9,6 +10,7 @@ import kotlinx.serialization.ExperimentalSerializationApi
910import kotlinx.serialization.InternalSerializationApi
1011import kotlinx.serialization.KSerializer
1112import kotlinx.serialization.SerializationException
13+ import kotlinx.serialization.serializer
1214import kotlinx.serialization.serializerOrNull
1315import kotlin.reflect.KClass
1416
@@ -21,7 +23,10 @@ object AppUtils {
2123 }
2224
2325 inline fun <reified T : Any > parseJson (value : String ): T {
24- return parseJson(value, T ::class )
26+ // serializer<T>() preserves full generic type info (e.g. List<DataClass>)
27+ // and must be resolved here while T is still reified, same for TypeReference
28+ val serializer = try { serializer<T >() } catch (_: Exception ) { null }
29+ return parseJson(value, T ::class , serializer, object : TypeReference <T >() {})
2530 }
2631
2732 @Deprecated(
@@ -63,17 +68,28 @@ object AppUtils {
6368 }
6469
6570 @InternalAPI
66- fun <T : Any > parseJson (value : String , kClass : KClass <T >): T {
71+ fun <T : Any > parseJson (
72+ value : String ,
73+ kClass : KClass <T >,
74+ serializer : KSerializer <T >? = null,
75+ typeReference : TypeReference <T >? = null,
76+ ): T {
6777 // @Serializable generates a serializer at compile time; contextual serializers are
6878 // registered manually in serializersModule, we need both to support all cases
69- val serializer = kClass.serializerOrNull() ? : json.serializersModule.getContextual(kClass)
70- return if (serializer != null ) {
79+ val s =
80+ serializer ? : kClass.serializerOrNull() ? : json.serializersModule.getContextual(kClass)
81+
82+ // Prefer Kotlin Serialization over Jackson
83+ if (s != null ) {
7184 try {
72- json.decodeFromString(serializer , value)
85+ return json.decodeFromString(s , value)
7386 } catch (e: SerializationException ) {
7487 logError(e)
75- mapper.readValue(value, kClass.java)
7688 }
89+ }
90+
91+ return if (typeReference != null ) {
92+ mapper.readValue(value, typeReference)
7793 } else {
7894 mapper.readValue(value, kClass.java)
7995 }
0 commit comments