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

Kotlin中如何创建独立内存的JSONObject新对象避免修改互相影响

解决方案

org.json.JSONObject属于引用类型,直接赋值仅复制内存地址引用,两个变量指向同一个实例,修改操作会同步生效。要获得完全独立的副本,需要做深拷贝,常见实现方式如下:

方法1:序列化反序列化(最简单通用,适合绝大多数场景)

直接将原JSONObject转为JSON字符串,再用字符串构造新的实例,即可实现全深度的独立拷贝:

val finalDesiredState = JSONObject(desiredJsonStructure.toString())

该方法会自动处理所有嵌套的JSONObject、JSONArray结构,拷贝后的新对象和原对象完全独立,修改不会互相影响。

方法2:手动实现深拷贝扩展函数(性能更优,适合高频调用场景)

如果不想承担字符串序列化的性能开销,可以手写递归拷贝的工具方法:

fun JSONObject.deepCopy(): JSONObject {
    val copy = JSONObject()
    keys().forEach { key ->
        when(val value = get(key)) {
            is JSONObject -> copy.put(key, value.deepCopy())
            is JSONArray -> copy.put(key, value.deepCopy())
            else -> copy.put(key, value)
        }
    }
    return copy
}

fun JSONArray.deepCopy(): JSONArray {
    val copy = JSONArray()
    for (i in 0 until length()) {
        when(val value = get(i)) {
            is JSONObject -> copy.put(value.deepCopy())
            is JSONArray -> copy.put(value.deepCopy())
            else -> copy.put(value)
        }
    }
    return copy
}

使用方式:

val finalDesiredState = desiredJsonStructure.deepCopy()

补充说明

如果你的JSON结构只有一层没有嵌套,也可以直接用JSONObject的拷贝构造实现浅拷贝:

// 仅浅拷贝第一层属性,嵌套的JSONObject/JSONArray还是共享引用
val finalDesiredState = JSONObject(desiredJsonStructure)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:15:03