kotlin中实现json更新处理、json合并处理、最终返回一个完整的 JSON 字符串

现在的 mergeDetailed 返回的是更新后的 Bean 对象,但你想要的是:将 JSON 数据合并到另一个 JSON 中,有就更新,没有就添加,最终返回一个完整的 JSON 字符串

也就是说,你需要一个 JsonObject 级别的合并工具,而不是先转成 Bean 再转回来。


方案:直接合并两个 JSON 字符串

kotlin 复制代码
package com.gzyq.ynlk.util

import com.google.gson.Gson
import com.google.gson.JsonObject
import com.google.gson.JsonParser

object JsonMergeUtil {

    val gson = Gson()

    /**
     * 将 sourceJson 合并到 targetJson 中
     * - targetJson 中存在的字段:用 sourceJson 的值覆盖
     * - targetJson 中不存在的字段:从 sourceJson 添加进来
     * - 返回合并后的完整 JSON 字符串
     */
    fun mergeJson(targetJson: String, sourceJson: String): String {
        val target = JsonParser.parseString(targetJson).asJsonObject
        val source = JsonParser.parseString(sourceJson).asJsonObject

        source.entrySet().forEach { (key, value) ->
            target.add(key, value)
        }

        return gson.toJson(target)
    }

    /**
     * 带详细信息的版本,返回合并后的 JSON 字符串 + 变更信息
     */
    fun mergeJsonDetailed(targetJson: String, sourceJson: String): JsonMergeResult {
        val target = JsonParser.parseString(targetJson).asJsonObject
        val source = JsonParser.parseString(sourceJson).asJsonObject

        val targetFields = target.keySet().toList()
        val sourceFields = source.keySet().toList()

        // 记录合并前的值
        val beforeMap = target.toValueMap()

        // 执行合并:source 覆盖/添加到 target
        source.entrySet().forEach { (key, value) ->
            target.add(key, value)
        }

        val afterMap = target.toValueMap()

        // 分析变更
        val updatedFields = sourceFields.filter { key ->
            key in targetFields && beforeMap[key] != afterMap[key]
        }
        val addedFields = sourceFields.filter { it !in targetFields }
        val unchangedFields = sourceFields.filter { key ->
            key in targetFields && beforeMap[key] == afterMap[key]
        }

        return JsonMergeResult(
            mergedJson = gson.toJson(target),
            updatedFields = updatedFields,      // 被修改的字段
            addedFields = addedFields,          // 新增的字段
            unchangedFields = unchangedFields,  // 值未变的字段
            sourceFields = sourceFields,
            targetFields = targetFields
        )
    }

    private fun JsonObject.toValueMap(): Map<String, String> {
        val map = mutableMapOf<String, String>()
        this.entrySet().forEach { (key, element) ->
            map[key] = element.toString()
        }
        return map
    }
}

// 返回结构体
data class JsonMergeResult(
    val mergedJson: String,           // 合并后的完整 JSON 字符串
    val updatedFields: List<String>,   // 被更新的字段(target 中已存在且值变了)
    val addedFields: List<String>,     // 新增的字段(target 中原来没有)
    val unchangedFields: List<String>, // 值未变的字段
    val sourceFields: List<String>,    // source 中的所有字段
    val targetFields: List<String>     // target 中的所有字段
)

使用示例

kotlin 复制代码
fun main() {
    val targetJson = """{"id":1,"user_name":"张三","user_age":25,"email":"test@qq.com"}"""
    val sourceJson = """{"user_name":"李四","user_age":25,"phone":"13800138000","address":"北京"}"""

    val result = JsonMergeUtil.mergeJsonDetailed(targetJson, sourceJson)

    println("合并后的 JSON:")
    println(result.mergedJson)
    // {"id":1,"user_name":"李四","user_age":25,"email":"test@qq.com","phone":"13800138000","address":"北京"}

    println("更新的字段:${result.updatedFields}")      // [user_name]
    println("新增的字段:${result.addedFields}")          // [phone, address]
    println("未变的字段:${result.unchangedFields}")      // [user_age]
}

对比你原来的用法

你的需求 原来的 mergeDetailed 新的 mergeJsonDetailed
输入 Bean + JSON 字符串 JSON 字符串 + JSON 字符串
输出 MergeResult<T>(Bean 对象) JsonMergeResult(JSON 字符串)
适用场景 需要拿到 Bean 对象做后续业务处理 只需要合并 JSON,不关心具体 Bean 类型

如果你还需要保留原来的 Bean 合并功能,可以把两个方法共存,按需使用。

相关推荐
耍酷的魔镜5 小时前
核心设计理念:5W2H、JSON-LD 与通用知识图谱
人工智能·json·知识图谱
自信的未来6 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
墨神谕8 小时前
JSON-RPC 2.0
网络协议·rpc·json
PixelBai12 小时前
什么是 JSON 验证工具?
json
花燃柳卧12 小时前
跨平台路由组件工程源码补充上传
android·flutter·kotlin
TechNomad13 小时前
Kotlin类对象与接口详解
android·kotlin
Ws_14 小时前
Kotlin Multiplatform day2
kotlin
码农学院17 小时前
电商零售品牌的6个技术信号——从JSON-LD结构化数据到llms.txt,让AI搜索主动推荐你的产品
人工智能·json·零售
月走乂山17 小时前
DeepSeek 对话记录一键导出:零依赖 Tampermonkey 脚本(支持 JSON/Markdown/ZIP)
json·油猴脚本·tampermonkey·数据导出·deepseek·对话记录·用户脚本
前网易架构师-高司机19 小时前
带标注的打电话识别数据集,识别率98.9%,9723张图,支持yolo,coco json,voc xml,文末有模型训练代码
yolo·json·手机·数据集·打电话