如何在KMM中将JSON字符串转换为对象



之前,我问过这个问题:在使用实现者类的接口中实现泛型方法,允许将对象转换为JSON字符串。

但是,现在我想反转这个过程。理想情况下,它看起来像:

interface Domain {
constructor(json: String) {
/*...*/
}
}
@Serializable
class User(val a: Int, val b: Int): Domain {}
val user = User("{a: 3, b: 4}")

但是,我无法弄清楚如何直接从JSON字符串构造对象。

下一个最好的选择是创建一个静态生成器方法:

interface Domain {
companion object {
inline fun <reified T> fromJSON(json: String): T {
return Json.decodeFromString(json)
}
}
}
val user = User.fromJSON("{a: 3, b: 4}")

但是,这根本不起作用,因为User没有继承Domain的伴侣对象。第三个最佳选择:

val user = Domain.fromJSON<User>("{a: 3, b: 4}")

这在Android端确实有效,但是由于fromJSON被声明为内联并被具体化,因此它根本不会从KMM暴露给iOS。

这让我想到了我现在的解决方案:

@Serializable
class User(val a: Int, val b: Int): Domain {
companion object {
fun fromJSON(json: String): User { return Json.decodeFromString(json) }
}
}
val user = User.fromJSON("{a: 3, b: 4}")

这是可行的,但是它需要将上面的样板代码添加到每个'Domain'对象中。

有什么方法可以改进我目前的解决方案吗?(当然,职位越高越好。)

我认为你有对象,那么你应该需要转换为:——

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.codewithfun.kotlin.jsonparser.models.Tutorial
fun main(args: Array<String>) {
val gson = Gson()
val gsonPretty = GsonBuilder().setPrettyPrinting().create()
val tutsList: List<Tutorial> = listOf(
Tutorial("Tut #1", "bezkoder", listOf("cat1", "cat2")),
Tutorial("Tut #2", "zkoder", listOf("cat3", "cat4"))
);
val jsonTutsList: String = gson.toJson(tutsList)
println(jsonTutsList)
val jsonTutsListPretty: String = gsonPretty.toJson(tutsList)
println(jsonTutsListPretty)
}

则输出如下:——

[{"title":"Tut #1","author":"bezkoder","categories":["cat1","cat2"]},{"title":"Tut #2","author":"zkoder","categories":["cat3","cat4"]}]
[
{
"title": "Tut #1",
"author": "bezkoder",
"categories": [
"cat1",
"cat2"
]
},
{
"title": "Tut #2",
"author": "zkoder",
"categories": [
"cat3",
"cat4"
]
}
]

相关内容

  • 没有找到相关文章

最新更新