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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:31:28