【问题标题】:toJson and fromJson cross platform supporttoJson 和 fromJson 跨平台支持
【发布时间】:2020-08-11 07:40:08
【问题描述】:

我有一个用 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 序列化和反序列化的帮助或建议将不胜感激。

【问题讨论】:

  • Gson 只是 JVM,因此您需要在其他地方使用其他东西。如果你追求 JS,你可以尝试使用github.com/Kotlin/kotlinx.serialization
  • @al3c 我知道,目前,我只在 android 和 iOS 之后。你有什么图书馆可以帮助我吗?
  • Kotlinx.serialization 也适用于 iOS,因为它可以编译为原生。
  • @GiorgosNeokleous 谢谢,我会试试看的。

标签: android json kotlin kotlin-multiplatform


【解决方案1】:

回答你的问题。您需要一个多平台 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)
  }
}

虽然这可行,但您不需要 toJsonfromJson 方法。自从你有一个像这样的课程时

@Serializable
class B {}

val b = B()

kotlinx.serialization 满足您的所有需求

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

【讨论】:

  • 这很有帮助。感谢您的时间和精力,我真的很感激。
猜你喜欢
  • 2010-09-07
  • 2022-09-23
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2017-11-15
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多