在通过 ktor 从 api 获取数据期间使用 serializable

Use serializable during taking data from api via ktor

提问人:Artur Andruszkiewicz 提问时间:11/3/2023 更新时间:11/4/2023 访问量:23

问:

我从api获取数据时遇到了问题。因为我的可序列化对象与数据类不同,我不知道我可以正确制作的方法。

如何从此 Json 数据中获取数据。我尝试通过 ktor 从 api 获取此内容,但在获取过程中遇到问题。我尝试获取的 Json 文件看起来像这样。

[
  {
    "email": "[email protected]",
    "id": 123,
    "user_name": "userName"
  },
  {
    "email": "[email protected]",
    "id": 1233,
    "user_name": "userName2"
  }
]

我尝试使用序列化程序,看起来像这样。

@Serializable
data class Users(
    val userList: List<Department>
)


@Serializable
data class User(
    val email: String,
    val id: Int,
    @SerialName("user_name")
    val userName: String
)

我使用 ktor 获取数据。

val client = HttpClient(CIO) {
    install(ContentNegotiation) {
        json(
            Json {
                useArrayPolymorphism = true
            }
        )
    }
}

和方法看起来像这样。

try {
    val response: Users = client.get{
        url(url)
    }.body()

    Log.d("getDataFromUrl", "${response.userList}")
} catch (e: Exception) {
    Log.d("getDataFromUrl", "${e.message}")
}
Android JSON Kotlin 序列化 ktor

评论


答:

1赞 Shreyas Sparrow 11/4/2023 #1

我试过你的代码。这两项更改可能有助于解决此问题。

  1. 在“用户”数据类中将“部门”更改为“用户”数据类

从:

@Serializable
data class Users(
      val userList: List<Department>
)

自:

@Serializable
data class Users(
      val userList: List<User>
)
  1. 由于您的 json 数组不包含键,我认为这就是序列化无法解析 json 的原因。因此,请更改您的代码,如下所示
    try {
        val response: Users = client.get{
            url(url)
        }.body<List<User>>()
    
        Log.d("getDataFromUrl", "${response.userList}")
    } catch (e: Exception) {
        Log.d("getDataFromUrl", "${e.message}")
    }