在 Kotlin 中解析 JSON 字符串,可以使用多种方式,包括原生的 org.json 包,以及流行的第三方库如 Gson、Jackson 和 Moshi。
一、原生 org.json 包
org.json 是一个轻量级的 Java 库,用于处理 JSON 数据。它提供了简单易用的 API,可以方便地将数据结构(如对象、数组等)转换为 JSON 字符串。
1、特点
- 简单易用:org.json 提供了直观的 API,可以轻松地将数据结构转换为 JSON 字符串。
- 支持复杂结构:可以处理嵌套对象和数组,适用于大多数常见的 JSON 数据结构。
- 轻量级:org.json 是一个轻量级库,不会引入过多的依赖。
- 转义问题:org.json 会自动处理特殊字符的转义,无需手动处理。
- 性能:对于非常大的数据结构,org.json 的性能可能不如一些专门的 JSON 库(如 Gson 或 Jackson)。如果需要处理大规模数据,可以考虑使用更高效的库。
- 功能限制:org.json 的功能相对简单,如果需要更高级的特性(如自定义序列化、反序列化等),可以考虑使用 Gson 或 kotlinx.serialization。
2、数据结构及字符串
data class UserModel(val name: String, val age: Int, val isGirl: Boolean, val hobbies: List<String>, val address: Address)
data class Address(val province: String, val detail: String)
val content = "{\"name\": \"Alice\", \"age\": 25, \"isGirl\": true, \"hobbies\": [\"reading\", \"coding\"], \"address\": {\"province\": \"fujian\", \"detail\": \"xx路xx小区\"}}"
3、demo 示例
package com.example.helloworld.json
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
object OrgJsonUtil {
/**
* 获取测试 Json 字符串
*/
fun getJsonString(): String {
val content = "{\"name\": \"Alice\", \"age\": 25, \"isGirl\": true, " +
"\"hobbies\": [\"reading\", \"coding\"], " +
"\"address\": {\"province\": \"fujian\", \"detail\": \"xx路xx小区\"}}"
return content
}
/**
* 解析 json 字符串为数据对象
* @param jsonString json字符串
* @return UserModel数据模型
*/
fun parseJson(jsonString: String): UserModel? {
try {
// 解析 Json 对象
val jsonObject = JSONObject(jsonString)
val name = jsonObject.getString("name")
val age = jsonObject.getInt("age")
val isGirl = jsonObject.getBoolean("isGirl")
// 解析 Json 数组
val hobbiesList = mutableListOf<String>()
val hobbiesArray = jsonObject.getJSONArray("hobbies")
for (i in 0 until hobbiesArray.length()) {
val hobby = hobbiesArray.getString(i)
hobbiesList.add(hobby)
}
// 解析子对象
val addressObject = jsonObject.getJSONObject("address")
val province = addressObject.getString("province")
val detail = addressObject.getString("detail")
return UserModel(name, age, isGirl, hobbiesList, Address(province, detail))
} catch (e: JSONException) {
e.printStackTrace()
return null
}
}
/**
* 将数据对象转换为 JSON 字符串
* put 方法插入键值时不会按顺序存储,故最后生成的字符串不一定是按照插入的顺序一致
*/
fun toJson(userModel: UserModel): String {
val jsonObject = JSONObject()
jsonObject.put("name", userModel.name)
jsonObject.put("age", userModel.age)
jsonObject.put("isGirl", userModel.isGirl)
// 数组
val hobbiesJson = JSONArray(userModel.hobbies)
jsonObject.put("hobbies", hobbiesJson)