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

如何用Kotlin简洁获取嵌套JSONObject中的指定值?

如何更简洁地从嵌套JSON中获取目标值?

嘿,我懂你这种感受——作为非Kotlin专家,对着多层嵌套的JSON写好几行get代码,确实有点繁琐。我来给你几个更简洁的解决方案,帮你少写点冗余代码!

你的当前实现

var options = request.getJSONObject("optionsObject");
var readingPosition = options.getJSONObject("readingPosition");
var selector = readingPosition.getJSONObject("selector");
var value = selector.getString("value");

对应的JSON结构

{ 
  "optionsObject":{ 
    "readingPosition":{ 
      "format":"application\/epub+zip", 
      "selector":{ 
        "type":"FragmentSelector", 
        "conformsTo":"http:\/\/www.idpf.org\/epub\/linking\/cfi\/epub-cfi.html", 
        "value":"epubcfi(\/6\/2!\/0)" 
      } 
    }, 
    "readingProgress":0 
  } 
}

简洁方案推荐

1. 直接链式调用(最快捷)

如果你不需要额外的空安全处理,完全可以把所有get操作链式写在一起,省去中间变量:

val value = request.getJSONObject("optionsObject")
                   .getJSONObject("readingPosition")
                   .getJSONObject("selector")
                   .getString("value")

提示:这种写法和你原来的代码行为一致——如果中间某个键不存在或者类型不匹配,会抛出JSONException。

2. 自定义扩展函数(更安全)

要是想避免运行时异常,自己写个简单的扩展函数就能实现安全的嵌套取值,返回null而不是抛出异常:

fun JSONObject.getNestedString(vararg keys: String): String? {
    var currentJson = this
    for (key in keys) {
        currentJson = currentJson.optJSONObject(key) ?: return null
    }
    return currentJson.optString("value")
}

调用的时候只需要传嵌套的键路径就行:

val value = request.getNestedString("optionsObject", "readingPosition", "selector")

3. 数据类+JSON解析库(长期最优)

如果你的项目经常要处理这类嵌套JSON,强烈建议用数据类配合Gson/Moshi这类解析库,代码可读性和维护性都会提升很多:

首先定义对应的数据类:

data class RequestData(
    val optionsObject: OptionsObject
)

data class OptionsObject(
    val readingPosition: ReadingPosition,
    val readingProgress: Int
)

data class ReadingPosition(
    val format: String,
    val selector: Selector
)

data class Selector(
    val type: String,
    val conformsTo: String,
    val value: String
)

然后用Gson解析并取值:

val gson = Gson()
val requestData = gson.fromJson(request.toString(), RequestData::class.java)
val value = requestData.optionsObject.readingPosition.selector.value

这种方式能在编译期检查类型,还能自动处理JSON解析的细节,再也不用手动一层层get了!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:52:30