本文由 资源共享网 – ziyuan 发布,转载请注明出处,如有问题请联系我们!JSON Merge Patch 合并结构体字段数据(golang)
收藏json Merge Patch,是一个Internet Engineering Task Force(IETF)标准。基本思想是,你有一个原始的json对象,然后根据提供的“补丁”JSON对象,最终生成原始JSON对象需要修改的结果。这种机制适用于部分更新(也称为PATCH更新)的场景。
例子
原始对象:
{ "Account": "old_account", "Name": "old_name", "Avatar": "old_avatar" }
补丁对象(patch object):
{ "Account": "new_account", "Name": null }
应用补丁对象后的待更新数据(PATCH更新):
{ "Account": "new_account", "Avatar": "old_avatar" }
简单来说,补丁对象(patch object)描述了以下几种修改:
添加或更新字段:如果补丁中的一个字段在原始对象中不存在,它会被添加;如果存在,它会被更新。
删除字段:如果补丁中的一个字段设置为null,并且该字段在原始对象中存在,那么该字段会被删除。
golang使用
使用实现IETF标准的JSON Merge Patch依赖库 json-patch
go get -u github.com/evanphx/json-patch
// 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) }
调用: