json - 如何将 JSON 字符串转换为 KMM 中的对象
问题描述
以前,我问过这个问题:在使用实现类的接口中实现泛型方法,该类允许将对象转换为 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}")
这可行,但是它需要将上述样板代码添加到每个“域”对象中。
反正有什么可以改进我目前的解决方案吗?(当然,链条越高越好。)
解决方案
我认为你有 Object 那么你应该需要将它转换为:--
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"
]
}
]
推荐阅读
- html - Cardview 布局未以正确的设计模式显示
- javascript - 在二进制表达式中优先考虑 * 和 /
- next.js - Nextjs 无效的 href 传递给路由器
- javascript - 如何在 JavaScript 中获取时区的确切时间而不是用户的本地时间?
- openssl - 没有 CRT 组件的 RSA 私钥 DER 解码失败
- c# - 如何在带有区域的 ASP.NET MVC 中创建菜单链接?
- javascript - PDF2pic:错误:在转换 pdf 时写入 EPIPE 错误
- java - 松弛发展
- python - csv比较排除了python中的重复项
- macos - 每个新提示都会触发错误