如何将 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 中的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将json转换为字符串

php如何将json对象转字符串

将 JSON 字符串转换为对象并显示为 HTML 表格

如何将带有对象数组的 json 字符串转换为带有 nsdictionaries 的 nsarray - IOS

如何将数据实体转换为 JSON 字符串

如何将数据实体转换为 JSON 字符串