Kotlin JSON
最后修改于 2024 年 1 月 29 日
本文展示了如何在 Kotlin 中进行 JSON 序列化和反序列化。 我们使用 Gson 和 kotlinx.serialization 库。
JSON(JavaScript 对象表示法) 是一种轻量级的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。 与 XML 相比,它更简洁、更易读。 JSON 的官方互联网媒体类型是 application/json。 JSON 文件扩展名是 .json。 JSON 可以被 JavaScript 直接使用。
Gson 是一个 Java 序列化/反序列化库,用于将 Java 对象转换为 JSON 及其反向转换。 Gson 由 Google 创建,供内部使用,后来开源。
kotlinx.serialization 是一个用于序列化的 Kotlin 库。
Gson toJson
toJson 方法将指定对象序列化为其等效的 JSON 表示形式。
package com.zetcode
import com.google.gson.Gson
data class User(val firstName: String, val lastName: String)
fun main() {
val colours = mutableMapOf(1 to "blue", 2 to "yellow", 3 to "green")
val gson = Gson()
val output = gson.toJson(colours)
println(output)
}
在本例中,我们使用 toJSon 方法将一个 map 序列化为 JSON。
Gson fromJson
fromJson 方法将指定的 JSON 反序列化为指定类的对象。
package com.zetcode
import com.google.gson.Gson
data class User(val firstName: String, val lastName: String)
fun main() {
val jsonString = """{"firstName":"Tom", "lastName": "Broody"}"""
val gson = Gson()
val user: User = gson.fromJson(jsonString, User::class.java)
println(user)
}
本例使用 fromJson 方法将 JSON 读入 Kotlin 对象。
GsonBuilder
GsonBuilder 使用各种配置设置构建 Gson。 GsonBuilder 遵循构建器模式,通常通过首先调用各种配置方法来设置所需的选项,最后调用 create 来使用它。
package com.zetcode
import com.google.gson.FieldNamingPolicy
import com.google.gson.GsonBuilder
fun main() {
val gson = GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.create()
val user = User("Peter", "Flemming")
println(gson.toJson(user))
}
在本例中,我们将一个对象写入 JSON。 我们使用 GsonBuilder 创建 Gson。
val gson = GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.create()
我们使用 GsonBuilder 创建和配置 Gson。 字段命名策略设置为 FieldNamingPolicy.UPPER_CAMEL_CASE。
美化打印 JSON 输出
Gson 有两种输出模式:紧凑模式和美化模式。
package com.zetcode
import com.google.gson.GsonBuilder
fun main() {
val gson = GsonBuilder().setPrettyPrinting().create()
val items = mutableMapOf(1 to "pencil", 3 to "chair", 5 to "book")
println(gson.toJson(items))
}
本例美化打印 JSON 输出。
val gson = GsonBuilder().setPrettyPrinting().create()
setPrettyPrinting 方法设置美化打印模式。
从 URL 读取 JSON
以下示例从网页读取 JSON 数据。 我们从 http://time.jsontest.com 获取 JSON 数据。
$ curl http://time.jsontest.com
{
"date": "06-01-2022",
"milliseconds_since_epoch": 1654109903352,
"time": "06:58:23 PM"
}
GET 请求返回此 JSON 字符串。
package com.zetcode
import com.google.gson.Gson
import java.net.URL
data class TimeData(val time:String, val milliseconds_since_epoch:Long, val date:String)
fun main() {
val webPage = URL("http://time.jsontest.com")
val data = webPage.readText()
val gson = Gson()
val td = gson.fromJson(data, TimeData::class.java)
println(td)
}
代码示例从 http://time.jsontest.com 读取 JSON 数据。
在接下来的示例中,我们使用 kotlinx-serialization-json 库。
Json.encodeToString
Json.encodeToString 方法将给定的值序列化并编码为字符串。
plugins {
kotlin("jvm") version "1.6.20"
kotlin("plugin.serialization") version "1.6.21"
}
...
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3")
testImplementation(kotlin("test"))
}
我们需要设置库。
package com.zetcode
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
@Serializable
data class User(val name: String, val occupation: String)
fun main() {
val u = User("John Doe", "gardener")
val r = Json.encodeToString(u)
println(r)
}
在本例中,我们序列化一个 User 类。
Json.decodeFromString
Json.decodeFromString 方法将给定的字符串解码并反序列化为给定类型的给定值。
package com.zetcode
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
@Serializable
data class User(val name: String, val occupation: String)
fun main() {
val userJson = """{"name":"John Doe","occupation":"gardener"}"""
val u = Json.decodeFromString<User>(userJson)
println(u)
}
在本例中,我们将 JSON 字符串解码为 User 对象。
来源
在本文中,我们展示了如何在 Kotlin 中使用 JSON。
作者
列出 所有 Kotlin 教程。