toJson和fromJson跨平台支持

时间:2020-08-11 07:40:08

标签: android json kotlin kotlin-multiplatform

我有一个用Kotlin编写的android应用程序。我有很多类,对于每个类,我都使用Gson's toJsonfromJson这些类的函数。例如:

class A{

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

fun fromJson(jsonString:String):A{
            return Gson().fromJson(jsonString, A::class)
   }
}

我还有另一堂课B

class B{
    
    fun toJson():String {
            return Gson().toJson(this)
        }
    
    fun fromJson(jsonString:String):B{
                return Gson().fromJson(jsonString, B::class)
       }
    }

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

val a = A()    
a.toJson()

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

我尝试创建期望函数,例如:

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

class A{

}

,然后像这样实现它们的实际实现:

actual fun toJsonClassA(): String {
    return Gson().toJson(A::class.java)
}

在上述特定于平台的实现中,我无法使用类名的实例调用toJsonClassAfromJsonClassA函数。

这行不通:

val a = A()
a.toJsonClassA()

对于我如何在Kotlin Multiplatform中实现Json序列化和反序列化的任何帮助或建议,将深表感谢。

1 个答案:

答案 0 :(得分:0)

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

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

虽然可行,但是您不需要toJsonfromJson方法。因为当你有一个像

@Serializable
class B {}

val b = B()

kotlinx.serialization

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