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

