Android 中 解析 JSON 字符串的几种方式

发布于:2025-06-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

在 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)
	
	        

网站公告

今日签到

点亮在社区的每一天
去签到