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

