如何在Kotlin中修改JSON值?含JS类比操作场景
好问题!在Kotlin里完全可以实现你想要的两种JSON对象修改方式,而且有不少成熟的库能帮你轻松搞定,下面给你详细拆解:
一、直接修改属性(对应JS的fullName.name = 'Martin')
在Kotlin中,解析JSON后通常会得到两种类型的结果:可变的JSON节点对象,或者数据类实例,两种情况的修改方式略有不同:
1. 针对JSON节点对象(如Jackson/Gson的内置节点)
如果用Jackson或Gson这类库解析后得到的是它们的JSON节点对象,可以直接修改属性:
Jackson示例:
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.readValue fun main() { val jsonStr = """{"name": "Milan", "surname": "Smolik"}""" val objectMapper = ObjectMapper() val fullName = objectMapper.readValue<com.fasterxml.jackson.databind.node.ObjectNode>(jsonStr) // 直接修改name字段 fullName.put("name", "Martin") println(objectMapper.writeValueAsString(fullName)) // 输出: {"name":"Martin","surname":"Smolik"} }
Gson示例:
import com.google.gson.JsonObject import com.google.gson.JsonParser fun main() { val jsonStr = """{"name": "Milan", "surname": "Smolik"}""" val fullName = JsonParser.parseString(jsonStr).asJsonObject // 直接修改name字段 fullName.addProperty("name", "Martin") println(fullName.toString()) // 输出: {"name":"Martin","surname":"Smolik"} }
2. 针对数据类实例
如果你把JSON解析成了Kotlin数据类,默认数据类属性是val(不可变),需要改成var才能直接修改:
// 定义可变属性的数据类 data class Person(var name: String, var surname: String) fun main() { // 假设已通过JSON库解析得到Person实例 val fullName = Person("Milan", "Smolik") fullName.name = "Martin" // 直接修改属性 println(fullName) // 输出: Person(name=Martin, surname=Smolik) }
二、创建新对象(对应JS的扩展运算符{...fullName, name: 'Martin'})
Kotlin的数据类天生自带copy()方法,完美实现这种不可变更新(原对象保持不变,生成一个修改了指定属性的新对象):
// 定义不可变属性的数据类(推荐用val) data class Person(val name: String, val surname: String) fun main() { val fullName = Person("Milan", "Smolik") // 只修改name字段,其他字段复用原值 val newFullName = fullName.copy(name = "Martin") println(fullName) // 原对象不变: Person(name=Milan, surname=Smolik) println(newFullName) // 新对象: Person(name=Martin, surname=Smolik) }
如果是JSON节点对象,也可以通过深拷贝+修改的方式实现不可变更新,比如Jackson的deepCopy():
val newFullName = fullName.deepCopy().apply { put("name", "Martin") }
三、推荐的Kotlin JSON处理库
这些主流库都能很好支持上述操作:
- Kotlinx Serialization:官方推荐的序列化库,和Kotlin语法高度契合,对数据类的支持非常友好,配合
copy()方法能轻松实现不可变更新。 - Jackson:Java生态最流行的JSON库,有专门的Kotlin扩展模块,支持可变/不可变的JSON节点操作,功能强大。
- Gson:Google出品的轻量JSON库,API简单直观,适合快速开发场景。
总结一下:Kotlin不仅能实现你需要的两种修改逻辑,而且通过数据类的copy()方法和成熟的JSON库,操作起来甚至比JS更顺手!
内容的提问来源于stack exchange,提问作者Milan Smolík
相关产品推荐
相关产品推荐

