toJson 和 fromJson 跨平台支持

1 android json kotlin kotlin-multiplatform

我有一个用 Kotlin 编写的 Android 应用程序。我有许多类,对于每个类,我都会使用这些类的Gson's toJson函数fromJson。例如:

class A{

fun toJson():String {
        return Gson().toJson(this)
    }

fun fromJson(jsonString:String):A{
            return Gson().fromJson(jsonString, A::class)
   }
}
Run Code Online (Sandbox Code Playgroud)

我还有另一堂课B

class B{
    
    fun toJson():String {
            return Gson().toJson(this)
        }
    
    fun fromJson(jsonString:String):B{
                return Gson().fromJson(jsonString, B::class)
       }
    }
Run Code Online (Sandbox Code Playgroud)

我使用的方法是创建该类的实例,然后调用该方法(注意:我正在class A另一个类中创建该类的实例 ():

val a = A()    
a.toJson()
Run Code Online (Sandbox Code Playgroud)

但我现在正在尝试将其转换为 kotlin 多平台项目,但不确定如何在 kotlin 多平台中进行to和json 转换。from

我尝试创建期望函数,如下所示:

expect fun toJsonClassA():String
expect fun fromJsonClassA(jsonString: String): A

class A{

}
Run Code Online (Sandbox Code Playgroud)

然后实现它们的实际实现如下:

actual fun toJsonClassA(): String {
    return Gson().toJson(A::class.java)
}
Run Code Online (Sandbox Code Playgroud)

通过上述特定于平台的实现,我无法使用类名的实例调用toJsonClassA或函数。fromJsonClassA

这是行不通的:

val a = A()
a.toJsonClassA()
Run Code Online (Sandbox Code Playgroud)

任何有关如何在 Kotlin Multiplatform 中实现 Json 序列化和反序列化的帮助或建议将不胜感激。

and*_*max 7

来回答你的问题。您需要一个多平台 json 序列化器(不是 GSon,因为它仅适用于 jvm),目前我只知道kotlinx.serialization. 有了它,你的代码应该看起来像这样

@Serializable
class A {
  fun toJson() = Json.stringify(A.serializer(),this)
  companion object {
    fun fromJson(json: String) = Json.parse(A.serializer(),json)
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然这可行,但您不需要toJsonfromJson方法。从你有这样的课程开始

@Serializable
class B {}

val b = B()
Run Code Online (Sandbox Code Playgroud)

所有你需要的kotlinx.serialization

  • 要转换为Json,Json.stringify(B.serializer(),b)
  • 要解析Json为 kotlin 对象,Json.parse(B.serializer(),"{}")