golang json字符串合并操作
用于两个json格式的字符串合并,当B向A合并时,共有的字段,将用B字段的值(伴随类型一起覆盖),非共有的,A的字段保留,B的字段新增。
example代码:
package main import (
"encoding/json"
"fmt"
) type S struct {
A uint32 `json:"a"`
B string `json:"b"`
C uint32 `json:"c"`
} type S1 struct {
B string `json:"b"`
C uint32 `json:"c"`
D uint32 `json:"d"`
} func main() {
s := S{
A: 12,
C: 2,
}
s1 := S1{
B: "123",
C: 99999,
D: 10,
}
js, _ := json.Marshal(s)
js1, _ := json.Marshal(s1) var m map[string]interface{}
json.Unmarshal(js, &m)
json.Unmarshal(js1, &m) res, _ := json.Marshal(m) fmt.Println(string(res)) // {"a":12,"b":"123","c":99999,"d":10}
}
ref:https://stackoverrun.com/cn/q/11154146
这样的方法无法递归合并,新方法可递归:
package main import (
"encoding/json"
"fmt"
"reflect"
) var jsonMergeDepth = 32 func main() {
buf1 := []byte(`{"a":1,"b":2}`)
buf2 := []byte(`{"c":3,"d":4,"a":"aaa"}`) var m1, m2 map[string]interface{} json.Unmarshal(buf1, &m1)
json.Unmarshal(buf2, &m2) merged := JsonMerge(m1, m2) fmt.Println(merged)
} func JsonMerge(dst, src map[string]interface{}) map[string]interface{} {
return jsMerge(dst, src, 0)
} func jsMerge(dst, src map[string]interface{}, depth int) map[string]interface{} {
if dst == nil {
dst = make(map[string]interface{})
}
if depth > jsonMergeDepth {
return dst
// panic("too deep!")
} for key, srcVal := range src { if dstVal, ok := dst[key]; ok { srcMap, srcMapOk := jsMapify(srcVal)
dstMap, dstMapOk := jsMapify(dstVal) if srcMapOk && dstMapOk {
srcVal = jsMerge(dstMap, srcMap, depth+1)
}
} dst[key] = srcVal
} return dst
} func jsMapify(i interface{}) (map[string]interface{}, bool) { value := reflect.ValueOf(i) if value.Kind() == reflect.Map { m := map[string]interface{}{} for _, k := range value.MapKeys() {
m[k.String()] = value.MapIndex(k).Interface()
} return m, true
} return map[string]interface{}{}, false
}
ref:https://golangnote.com/topic/209.html
golang json字符串合并操作的更多相关文章
- 【JSON】JSON字符串的操作(不断积累中)
一.JS遍历JSON串 示例01 目标:返回的JSON串中,一个Key对应的Value是一个数组(若在Java程序中,是一个List). 现在要求获取每个数组中的第一个对象元素中的name属性的值. ...
- golang中的文件操作
一.文件的基本介绍 文件是数据源(保存数据的地方)的一种,比如经常使用的word文档,txt文件,excel文件都是文件.文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音等等. ...
- C#解析JSON字符串总结
JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...
- C#解析JSON字符串总结(转载)
JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...
- 解决json字符串转为对象时LocalDateTime异常问题
1 出现异常 这次的异常出现在前端向后端发送请求体里带了两个日期,在后端的实体类中,这两个日期的格式都是JDK8中的时间类LocalDateTime.默认情况下,LocalDateTime只能解析20 ...
- 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何
基于 Vue.js 之 iView UI 框架非工程化实践记要 像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...
- JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- JS 操作JSON字符串
用Js的eval解析JSON中的注意点 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eva ...
- Queryable.Union 方法实现json格式的字符串合并
1.在数据库中以json字符串格式保存,如:[{"name":"张三","time":"8.592","are ...
- 使用 Newtonsoft.Json 操作 JSON 字符串
一.把实体类转化为 JSON 字符串 1. 为实体类赋值 SenderFromMQSearch senderFromMQSearch = new SenderFromMQSearch(); sende ...
随机推荐
- 【SpringBoot实战专题】「开发实战系列」从零开始教你舒服的使用RedisTemplate操作Redis数据
SpringBoot快速操作Redis数据 在SpringBoot框架中提供了spring-boot-starter-data-redis的依赖组件进行操作Redis服务,当引入了该组件之后,只需要配 ...
- [Leetcode]移除链表元素
题目 代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * Li ...
- Volcano 社区 v1.7.0 版本正式发布 | 云原生批量计算
摘要:北京时间2023年1月9日,Volcano社区v1.7.0版本正式发布. 本文分享自华为云社区<Volcano 社区 v1.7.0 版本正式发布 | 云原生批量计算>,作者:华为云云 ...
- 基于 VScode 搭建 Matlab 运行环境
插件 Matlab:代码高亮.语法检查.用户片段 matlab-formatter:代码格式化 Matlab Interactive Terminal:集成终端 配置 Matlab "fil ...
- angular11报错Can't bind to 'ngForOf' since it isn't a known property of 'tr'. 三种排查办法以及解决方案
当你遇到Can't bind to 'ngForOf' since it isn't a known property of 'tr'. (" //无法绑定到"ngforof&qu ...
- Codeforces Round #601 (Div. 2) A-E
比赛链接 A 题意 给两个数字 \(a,b\) ,每次操作可以使 \(a\) 加上 \(+1,+2,+5,-1,-2,-5\) 中的一个数,求最少多少次操作可以将 \(a\) 变成 \(b\) . 题 ...
- Google Cloud Spanner 究竟是什么?
谷歌于2017年推出的Google Cloud Spanner,原是谷歌内部使用的一个数据服务,后来又成为了谷歌云平台上搭建的数据库服务. Google Cloud Spanner 是一种数据库,它结 ...
- Failed to find "GL/gl.h" in "/usr/include/libdrm"
环境qt5.12.3 deepin15.10 使用cmake构建项目时报错,网上查询了一下发现时未安装opengl,于是安装便是了 sudo apt install mesa-common-dev 问 ...
- AD7793 ADC FPGA控制逻辑实现
AD7793简介 https://www.analog.com/media/en/technical-documentation/data-sheets/AD7792_7793.pdf 特点如下,有1 ...
- 浅谈Pytest中的marker
浅谈Pytest中的marker 没有注册marker 我们写一个简单的测试 # test_demo.py import pytest @pytest.mark.login def test_demo ...