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

Kotlin中如何将额外属性合并到JSON字符串的二级层级无需定义完整模型类

你定义的PropertiesToAdd是符合需求的,timeout为数值类型、waityes为字符串类型,和你期望输出的JSON结构完全匹配。以下是两种不需要定义原始JSON完整模型类的实现方案:

方案1:使用Android原生org.json库(无第三方依赖)

适合轻量使用场景,无需引入额外依赖,实现代码如下:

import org.json.JSONObject

// 原始JSON字符串
val originalJson = """
{
 "level 1": "hello",
 "level 2" : {
    "test1": 0,
    "test2": 5,
    "test3": "this is test"
  }
}
""".trimIndent()

val addProps = PropertiesToAdd()

val rootObj = JSONObject(originalJson)
// 提取二级level 2节点
val level2Obj = rootObj.getJSONObject("level 2")
// 追加属性
level2Obj.put("timeout", addProps.timeout)
level2Obj.put("waityes", addProps.waityes)

// 输出格式化后的结果,参数4为缩进空格数
val result = rootObj.toString(4)

如果需要合并的属性较多,可以写个反射工具函数把data class的字段批量put到JSONObject中,无需逐个手写。

方案2:使用Jackson(Kotlin常用JSON处理库)

如果项目已经引入Jackson依赖,可以直接序列化data class后批量合并,不用手动逐个处理字段:

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.node.ObjectNode
import com.fasterxml.jackson.module.kotlin.registerKotlinModule

// 初始化适配Kotlin的Jackson实例
val mapper = ObjectMapper().registerKotlinModule()

val originalJson = """
{
 "level 1": "hello",
 "level 2" : {
    "test1": 0,
    "test2": 5,
    "test3": "this is test"
  }
}
""".trimIndent()

val addProps = PropertiesToAdd()

val rootNode = mapper.readTree(originalJson)
val level2Node = rootNode.get("level 2") as ObjectNode
// 将待添加的data class转为Json节点后批量合并
val addNode = mapper.valueToTree<JsonNode>(addProps)
level2Node.setAll(addNode)

// 输出格式化的结果
val result = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode)

补充说明

两种方案都不需要为原始JSON定义完整的映射模型类,直接操作JSON树节点即可。如果待添加的字段很少,直接手动put即可,不需要额外把data class转成JSON;如果字段较多,序列化data class后批量合并效率更高,也不容易出现手写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:06:01