以前,我问过这个问题:在使用实现类的接口中实现泛型方法,该类允许将对象转换为 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}")
这可行,但是它需要将上述样板代码添加到每个“域”对象中。
反正有什么可以改进我目前的解决方案吗?(当然,链条越高越好。)