1

以前,我问过这个问题:在使用实现类的接口中实现泛型方法,该类允许将对象转换为 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}")

这可行,但是它需要将上述样板代码添加到每个“域”对象中。

反正有什么可以改进我目前的解决方案吗?(当然,链条越高越好。)

4

1 回答 1

0

我认为你有 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"
    ]
  }
]
于 2021-11-16T10:42:18.133 回答