如何用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
相关产品推荐
相关产品推荐

