You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何读取顶级数组结构的JSON数据?

解决顶级数组JSON解析的问题

嘿,完全懂你这种卡了整个周末的挫败感!别担心,咱们换个更靠谱的方式来解析这个JSON,不用再去扒HTML啦~

你的需求是读取一个**顶级数组(仅包含单个对象)**的JSON文件,这其实是很常见的场景,用Android常用的JSON解析库就能轻松搞定,下面给你两种简单易行的方案:

方案一:用Gson直接解析(适合快速上手)

Gson是Google官方的JSON解析库,非常适合新手快速落地。

  1. 添加依赖
    在你的app模块的build.gradle(或build.gradle.kts)里加入Gson的依赖:
implementation 'com.google.code.gson:gson:2.10.1'
  1. 创建对应的数据类
    先根据你JSON里的对象结构,写一个数据类。比如你的JSON是[{"userId": 1, "userName": "Needler"}],那数据类就可以这么写:
data class User(
    val userId: Int,
    val userName: String
    // 把JSON里的其他字段都对应加上
)
  1. 获取网络JSON并解析
    先通过网络请求拿到JSON字符串(这里用OkHttp举例,记得先加OkHttp依赖implementation 'com.squareup.okhttp3:okhttp:4.11.0'),然后用Gson解析成数组,再取第一个元素:
// 1. 发起网络请求拿JSON字符串
val okHttpClient = OkHttpClient()
val request = Request.Builder()
    .url("https://your-domain.com/your-file.json") // 替换成你的JSON文件URL
    .build()

okHttpClient.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        // 处理网络请求失败的情况,比如弹出提示
    }

    override fun onResponse(call: Call, response: Response) {
        response.body()?.string()?.let { jsonString ->
            // 2. 解析JSON字符串
            val gson = Gson()
            val userArray = gson.fromJson(jsonString, Array<User>::class.java)
            val targetUser = userArray.firstOrNull() // 因为数组里只有一个对象,取第一个就好
            
            // 拿到对象后就可以用啦,记得切换到主线程更新UI
            runOnUiThread {
                targetUser?.let {
                    // 比如显示userName
                    // textView.text = it.userName
                }
            }
        }
    }
})

方案二:用Retrofit+Gson(更适合长期项目)

Retrofit是专门用于网络请求的库,能把网络请求和JSON解析一步搞定,代码更整洁易维护。

  1. 添加依赖
    同样在build.gradle里加入Retrofit和Gson转换器的依赖:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
  1. 创建API接口
    定义一个接口,指定请求的URL和返回类型(因为是顶级数组,所以返回Call<List<User>>):
interface UserApi {
    @GET("your-file.json") // 这里填JSON文件在域名下的路径
    fun getUser(): Call<List<User>>
}
  1. 初始化Retrofit并发起请求
// 初始化Retrofit
val retrofit = Retrofit.Builder()
    .baseUrl("https://your-domain.com/") // 替换成你的基础域名
    .addConverterFactory(GsonConverterFactory.create())
    .build()

// 创建API实例
val userApi = retrofit.create(UserApi::class.java)

// 发起请求
userApi.getUser().enqueue(object : Callback<List<User>> {
    override fun onResponse(call: Call<List<User>>, response: Response<List<User>>) {
        if (response.isSuccessful) {
            val userList = response.body()
            val targetUser = userList?.firstOrNull()
            
            // 处理拿到的对象,同样要切换到主线程更新UI
            runOnUiThread {
                targetUser?.let {
                    // 做你需要的操作
                }
            }
        } else {
            // 处理请求返回错误的情况
        }
    }

    override fun onFailure(call: Call<List<User>>, t: Throwable) {
        // 处理网络失败
    }
})

几个新手必注意的点

  • 别忘了在AndroidManifest.xml里加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
  • 如果你的JSON是HTTP明文链接(不是HTTPS),Android 9及以上默认会拦截,你需要在res/xml里创建network_security_config.xml并在Manifest里引用,或者直接改用HTTPS链接。

这样一来,你就不用再去解析HTML里的字段了,直接解析JSON既高效又不容易出错,试试吧!

内容的提问来源于stack exchange,提问作者Needler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:00:01