前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JSON Merge Patch 合并结构体字段数据

JSON Merge Patch 合并结构体字段数据

作者头像
HHTjim 部落格
发布2023-11-01 14:54:57
2530
发布2023-11-01 14:54:57
举报
文章被收录于专栏:HHTjim'S 部落格HHTjim'S 部落格

json Merge Patch,是一个Internet Engineering Task Force(IETF)标准。基本思想是,你有一个原始的JSON对象,然后根据提供的“补丁”JSON对象,最终生成原始JSON对象需要修改的结果。这种机制适用于部分更新(也称为PATCH更新)的场景。

例子

原始对象:

代码语言:javascript
复制
{
  "Account": "old_account",
  "Name": "old_name",
  "Avatar": "old_avatar"
}

补丁对象(patch object):

代码语言:javascript
复制
{
  "Account": "new_account",
  "Name": null
}

应用补丁对象后的待更新数据(PATCH更新):

代码语言:javascript
复制
{
  "Account": "new_account",
  "Avatar": "old_avatar"
}

简单来说,补丁对象(patch object)描述了以下几种修改:

  • 添加或更新字段:如果补丁中的一个字段在原始对象中不存在,它会被添加;如果存在,它会被更新。
  • 删除字段:如果补丁中的一个字段设置为null,并且该字段在原始对象中存在,那么该字段会被删除。

golang使用

使用实现IETF标准的JSON Merge Patch依赖库 json-patch

代码语言:javascript
复制
go get -u github.com/evanphx/json-patch
代码语言:javascript
复制
// JOSN PATCH
// dst 原始对象
// patch 补丁对象
// return 将补丁应用到原始对象
func MergePatch(dst, patch interface{}) error {
    // 序列化目标(原始)结构体到JSON
    dstJSON, err := json.Marshal(dst)
    if err != nil {
        return err
    }

    // 序列化补丁结构体到JSON,这个补丁描述了如何修改目标(原始)对象
    patchJSON, err := json.Marshal(patch)
    if err != nil {
        return err
    }

    // 使用补丁合并目标(原始)对象
    mergedJSON, err := jsonpatch.MergePatch(dstJSON, patchJSON)
    if err != nil {
        return err
    }

    // 反序列化合并后的JSON回到目标(原始)结构体
    return json.Unmarshal(mergedJSON, dst)
}

调用:

代码语言:javascript
复制
    if err := MergePatch(&originJSON, &patchJSON); err != nil {
        u.JSONResponseError(ctx, err)
        return
    }

    // originJSON 就是应用过补丁的最新原始结构数据

参考: https://datatracker.ietf.org/doc/html/rfc7396

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例子
  • golang使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档