如何将 JSON 字符串转换为 KMM 中的对象
Posted
技术标签:
【中文标题】如何将 JSON 字符串转换为 KMM 中的对象【英文标题】:How to convert a JSON string to an Object in KMM 【发布时间】:2021-12-06 21:54:44 【问题描述】:之前,我问过这个问题:Implementing generic method in interface that uses implementors class,它允许将对象转换为 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")
这可行,但是它需要将上述样板代码添加到每个“域”对象中。
我目前的解决方案有什么需要改进的地方吗? (当然,链条越高越好。)
【问题讨论】:
【参考方案1】:我认为你有 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"
]
]
【讨论】:
这个答案与我的问题无关。以上是关于如何将 JSON 字符串转换为 KMM 中的对象的主要内容,如果未能解决你的问题,请参考以下文章