对比解析php和go对JSON处理的区别
一、go 转化php数组代码
php程序
$str = <<<EOF
{"操作源":"任意","数据库":"任意","语句类型":"CREATE DATABASE;DROP DATABASE;ALTER DATABASE","影响行数":"不涉及","告警阈值":"执行1次"}
EOF;
$data = ['title' => '标题','list' => $str
];
$const = ['operate_account' => '操作源', 'db_name' => '数据库', 'sql_type' => '语句类型', 'rows' => '影响行数', 'alarm_line' => '告警阈值'];
$data['list'] = json_decode($data['list'], 320);$newArr2['title']=$data['title'];
foreach ($data['list'] as $key => $v) {$newArr2['content'][array_search($key,$const)]= $v;
}dd($data);
dd($newArr2);function dd($param)
{echo "<pre>";print_r($param);echo "<pre>";
}

转化go语言
package mainimport ("encoding/json""github.com/gin-gonic/gin"
)type Data struct {Title string `json:"title"`Content map[string]string `json:"content"`
}func main() {r := gin.Default()// 多行JSON字符串jsonStr := `{"操作源": "任意","数据库": "任意","语句类型": "CREATE DATABASE;DROP DATABASE;ALTER DATABASE","影响行数": "不涉及","告警阈值": "执行1次"}`// 转化为Go结构体var data map[string]interface{}if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {panic("无法解析JSON数据")}// 定义常量映射constMap := map[string]string{"操作源": "operate_account","数据库": "db_name","语句类型": "sql_type","影响行数": "rows","告警阈值": "alarm_line",}// 创建新的数据结构var newArr2 DatanewArr2.Title = "标题"// 创建内容的映射newArr2.Content = make(map[string]string)// 遍历data中的数据for key, value := range data {// 查找映射关系mappedKey, exists := constMap[key]//fmt.Println(key, value, exists, constMap["数据库"], mappedKey)//os.Exit(2232)if exists {newArr2.Content[mappedKey] = value.(string)}}r.GET("/data", func(c *gin.Context) {c.JSON(200, newArr2)})r.Run(":8081")
}
转化结果:

二、go 语言中 json.Unmarshal与 json.Marshal 区别
简介
Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json 字符串,另一端再将该字符串解析成相应的数据结构,如string类型,strcut对象等。
1.Json Marshal:将数据编码成json字符串
type Stu struct {Name string `json:"name"`Age intsex string //小写的字段不可导出,所以无法序列化Class *Class `json:"class"`
}type Class struct {Name stringGrade int
}func main() {//实例化一个数据结构,用于生成json字符串stu := Stu{Name: "张三",Age: 18,sex: "男",}//指针变量cla := new(Class)cla.Name = "1班"cla.Grade = 3stu.Class=clajsonStu, err := json.Marshal(stu)if err != nil {fmt.Println(err.Error())}// jsonStu是[]byte类型,转化为string类型便于查看fmt.Println(string(jsonStu))
}
结果
{"name":"张三","Age":18,"class":{"Name":"1班","Grade":3}}
从结果中可以看出
- 只要是可导出成员(变量首字母大写),都可以转成json。踩坑点:因成员变量sex是不可导出的,故无法转成json。
- 如果变量打上了json标签,如Name旁边的 json:"name" ,那么转化成的json key就用该标签“name”,否则取变量名作为key,如“Age”,“HIgh”。
- bool类型也是可以直接转换为json的value值。Channel, complex 以及函数不能被编码json字符串。当然,循环的数据结构也不行,它会导致marshal陷入死循环。
- 指针变量,编码时自动转换为它所指向的值,如cla变量。(当然,不传指针,Stu struct的成员Class如果换成Class struct类型,效果也是一模一样的。只不过指针更快,且能节省内存空间。)
最后,强调一句:json编码成字符串后就是纯粹的字符串了。
总结: 将map或者结构体传入json.Marshal函数,生成json,返回类型为[]byteJson
2.Unmarshal:将json字符串解码到相应的数据结构
type StuRead struct {Name interface{} `json:"name"`Age interface{}HIgh interface{}sex interface{}Class interface{} `json:"class"`Test interface{}
}type Class struct {Name stringGrade int
}func main() {//json字符中的"引号,需用\进行转义,否则编译出错//json字符串沿用上面的结果,但对key进行了大小的修改,并添加了sex数据data:="{\"name\":\"张三\",\"Age\":18,\"high\":true,\"sex\":\"男\",\"CLASS\":{\"naME\":\"1班\",\"GradE\":3}}"str:=[]byte(data)//1.Unmarshal的第一个参数是json字符串,第二个参数是接受json解析的数据结构。//第二个参数必须是指针,否则无法接收解析的数据,如stu仍为空对象StuRead{}//2.可以直接stu:=new(StuRead),此时的stu自身就是指针stu:=StuRead{}err:=json.Unmarshal(str,&stu)//解析失败会报错,如json字符串格式不对,缺"号,缺}等。if err!=nil{fmt.Println(err)}fmt.Println(stu)
}
结果:
{张三 18 true <nil> map[naME:1班 GradE:3] <nil>}
总结:
json字符串解析时,需要一个“接收体”接受解析后的数据,且Unmarshal时接收体必须传递指针。否则解析虽不报错,但数据无法赋值到接受体中。如这里用的是StuRead{}接收,也可以使用map进行接收。
解析时,接收体可自行定义。json串中的key自动在接收体中寻找匹配的项进行赋值。匹配规则是:
- 先查找与key一样的json标签,找到则赋值给该标签对应的变量(如Name)。
- 没有json标签的,就从上往下依次查找变量名与key一样的变量,如Age。或者变量名忽略大小写后与key一样的变量。如HIgh,Class。第一个匹配的就赋值,后面就算有匹配的也忽略。
- (前提是该变量必需是可导出的,即首字母大写)。
- 不可导出的变量无法被解析(如sex变量,虽然json串中有key为sex的k-v,解析后其值仍为nil,即空值)
- 当接收体中存在json串中匹配不了的项时,解析会自动忽略该项,该项仍保留原值。如变量Test,保留空值nil。
- 你一定会发现,变量Class貌似没有解析为我们期待样子。因为此时的Class是个interface{}类型的变量,而json串中key为CLASS的value是个复合结构,不是可以直接解析的简单类型数据(如“张三”,18,true等)。所以解析时,由于没有指定变量Class的具体类型,json自动将value为复合结构的数据解析为map[string]interface{}类型的项。也就是说,此时的struct Class对象与StuRead中的Class变量没有半毛钱关系,故与这次的json解析没有半毛钱关系。
注意:若转换为结构体之后想继续操作序列化之后的字段,此时interface{}需要转化为对应的类型,使用v.(type),type为需要转化的类型。如interface.(string),使用需谨慎,类型不对会引发panic。
若结构体里有的字段不想序列化,而想保留原json,办法还是有的,我们可以将该变量定义为json.RawMessage类型,保留原json可以进行二次解析。
type StuRead struct {Name interface{}Age interface{}HIgh interface{}Class json.RawMessage `json:"class"` //注意这里
}
三、应用样例参考
/*data := map[string]interface{}{"name": "Tom","age": 18,"gender": "male",}str, err := JsonEncode(data)
*/
func JsonEncode(v interface{}) (string, error) {b, err := json.Marshal(v)if err != nil {return "", err}return string(b), nil
}/*var decodedData map[string]interface{}err = JsonDecode(str, &decodedData)
*/
func JsonDecode(s string, v interface{}) error {return json.Unmarshal([]byte(s), v)
}
参考:Go的json序列化:Marshal与Unmarshal_json marshal-CSDN博客
相关文章:
对比解析php和go对JSON处理的区别
一、go 转化php数组代码 php程序 $str <<<EOF {"操作源":"任意","数据库":"任意","语句类型":"CREATE DATABASE;DROP DATABASE;ALTER DATABASE","影响行数":"不…...
HTTP和HTTPS本质区别——SSL证书
HTTP和HTTPS是两种广泛使用的协议,尽管它们看起来很相似,但是它们在网站数据传输的安全性上有着本质上的区别。 HTTP是明文传输协议,意味着通过HTTP发送的数据是未经加密的,容易受到拦截、窃听和篡改的风险。而HTTPS通过使用SSL或…...
JS 防抖和节流
防抖(debounce)和节流(throttle)是JavaScript中常用的性能优化技术,用于限制某些高频率触发的函数执行次数,减少不必要的计算和网络请求。下面分别介绍防抖和节流的实现方式。 防抖(Debounce&am…...
Django开发实例总结(入门级、4.2.6、详细)
目录 概述 Django的核心组件包括 Django的项目结构 创建工程(4.2.6) 实例一:Hello world 实例二:访问一个自定义主页 实例三:通过登录跳转到主页 实例四:主页添加静态文件,包含js、css、…...
Variations-of-SFANet-for-Crowd-Counting可视化代码
前文对Variations-of-SFANet-for-Crowd-Counting做了一点基础梳理,链接如下:Variations-of-SFANet-for-Crowd-Counting记录-CSDN博客 本次对其中两个可视化代码进行梳理 1.Visualization_ShanghaiTech.ipynb 不太习惯用jupyter notebook, 这里改成了p…...
所有的人机交互都存在不匹配现象
从接受理论的角度来看,就像夫妻一样,所有的人机交互都存在不匹配的现象。 接受理论是一个解释人们如何学习和接受信息的心理模型。该理论认为,当人们学习新信息时,他们会将其与自己已有的知识和经验联系起来,以便更好地…...
LED数码管的静态显示与动态显示(Keil+Proteus)
前言 就是今天看了一下书上的单片机实验,发现很多的器件在Proteus中都不知道怎么去查找,然后想做一下这个实验,尝试能不能实现,LED数码管的两个还可以实现,但是用LED点阵显示器的时候他那个网络标号不知道是什么情况&…...
webGL编程指南 第五章 TexturedQuad_Clamp_Mirror
我会持续更新关于wegl的编程指南中的代码。 当前的代码不会使用书中的缩写,每一步都是会展开写。希望能给后来学习的一些帮助 git代码地址 :空 上一章节中我们学习了如何使用varyting变量绘制图片,本章节,我们学习texParameter…...
【Azure】存储服务:Azure 的存储账户
文章目录 一、前提知识(建议了解)二、介绍 Azure 存储帐户三、使用 Microsoft Azure 门户创建存储帐户 一、前提知识(建议了解) 在每一个云厂商中,都有自身的云存储,也有根据不同功能进行区分的不同类型的…...
高等数学啃书汇总重难点(十一)曲线积分与曲面积分
依旧是公式极其复杂恶心的一章,建议是:掌握两种线面积分的计算套路即可,和第8章一样属于同济版教材中最不重要的章节,不会对底层理解做过多考察~ 1.弧长曲线积分的几何意义 2.弧长曲线积分的定义和性质 3.弧长曲线积分的计算方式 …...
【算法专题】双指针—盛最多水的容器
一、题目解析 分析这个题目不难得出一个容积公式 二、算法原理 解法一:暴力枚举(超时) 套用上述的容积公式,使用两个for循环来枚举出所有可能的情况,再挑出最大值即可,但是这种写法会超时,导致…...
java入门,程序=数据结构+算法
一、前言 在学习java的时候,我印象最深的一句话是:程序数据结构算法,对于写java程序来说,这就是java的入门。 二、java基本数据结构与算法 1、数据类型 java中的数据类型8种基本数据类型: 整型 byte 、short 、int…...
9.MySQL索引的操作
个人主页:Lei宝啊 愿所有美好如期而遇 目录 索引操作 查询索引 创建主键索引 唯一索引的创建 普通索引的创建 全文索引的创建 删除索引 索引创建原则 索引操作 查询索引 第一种方法: show keys from 表名\G 我们了解其中几个就好。 第二种方法…...
大型加油站3d全景虚拟现实展示平台实现全方位立体呈现
近年来,随着国民经济的快速发展,交通基础设施的不断改善,机动车保有量的持续飙升,以至于加油站的建设数量和密度也在不断扩张。加油站作为人流量大且常见的城市场景,对加油站进行安全防范措施具有非常重要的安全意义。…...
Reading:Deep dive into the OnPush change detection strategy in Angular
原文连接:IndepthApp 今天深入阅读并总结Angualr中onPush更新策略。 1. 两种策略 & whats Lview? Angular 实现了两种策略来控制各个组件级别的更改检测行为。这些策略定义为Default和OnPush: 被定义为枚举: export enum…...
野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍
STM32入门——基于野火 F407 霸天虎课程学习 前言 博主开始探索嵌入式以来,其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪,不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科…...
@reduxjs/toolkit配置react-redux解决createStore或将在未来被淘汰警告
通常 我们用redux都需要通过 createStore 但目前 你去用它 基本都会被划线 甚至有点厉害的的编辑器 他会直接告诉你这个东西基本快被弃用了 这个应该大家都知道 最好不要用已经被明确未来或弃用的语法 因为一旦弃用这个系统就需要维护 而且说 一般会被淘汰的语法 本身也就是有…...
致敬1024天前的自己
今早打开手机就收到了来自CSDN的消息,哦,距离我发表第一篇技术博客已经过去1024个日夜了。 我第一次发技术博客是我大二做完我第一个网站时写的。因为网站需要上线服务器,涉及到不少linux相关的知识,我在自学的过程中走了不少弯路…...
〖Python网络爬虫实战㊱〗- JavaScript 网站加密和混淆
订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度…...
基于单片机设计的电子柜锁
一、前言 随着现代社会的不断发展,电子柜锁的应用越来越广泛。传统的机械柜锁存在一些不便之处,例如钥匙容易丢失、密码容易泄露等问题。设计一款基于单片机的电子柜锁系统成为了一个有趣而有意义的项目。 该电子柜锁系统通过电磁锁作为柜锁的开关&…...
On the Spectral Geometry of Cognitive Manifolds and the Emergence of Physical Laws
On the Spectral Geometry of Cognitive Manifolds and the Emergence of Physical Laws (A Noncommutative Framework for Free Will, Physical Constants, and Arithmetical Obstructions)作者:方见华 单位:世毫九实验室摘要&am…...
STM32驱动AS-108M/AD-013指纹模块底层协议与高可靠实现
1. SparkFun串口指纹识别模块AS-108M与AD-013底层驱动技术解析 SparkFun Serial Fingerprint Scanners AS-108M 和 AD-013 是两款基于国产中科芯(CETC)ZFM-20系列指纹识别模组核心的工业级串口指纹传感器。尽管官方文档简略,但通过逆向分析其…...
【稀缺首发】PyTorch 3.0静态图分布式训练性能基线报告(A100×8实测:静态图提速2.7×,通信开销下降63%)
第一章:PyTorch 3.0静态图分布式训练配置概览PyTorch 3.0 引入了原生静态图(Static Graph)支持,通过 torch.compile() 默认后端 inductor 与分布式运行时深度协同,显著提升多卡训练的启动速度与稳定吞吐。静态图模式下…...
新手福音:在wsl2中用快马生成你的第一个python命令行工具
最近在学WSL2开发环境搭建,发现对新手最头疼的不是写代码,而是配环境、记命令这些前期准备。好在发现了InsCode(快马)平台,用它生成的Python命令行工具项目特别适合练手,连我这种Linux小白都能半小时跑通全流程。记录下这个超适合…...
避坑指南:Ubuntu20.04下用Python3.8搞定Carla 0.9.13预编译版与ROS Bridge(解决卡死问题)
Ubuntu 20.04下Python 3.8与Carla 0.9.13的完美联姻:ROS Bridge避坑全指南 当自动驾驶仿真遇上机器人操作系统,Carla与ROS的集成堪称绝配。但这对黄金搭档的联姻之路却布满荆棘——Python版本冲突、依赖库不兼容、环境变量混乱,每一个坑都可能…...
跨越平台鸿沟:在非ROS环境中通过Rosbridge与ROS 2 Humble高效通信
1. 为什么需要Rosbridge? 在机器人开发领域,ROS 2 Humble已经成为主流操作系统之一。但现实情况是,很多开发者可能需要在Windows、MacOS甚至是没有安装ROS的Linux环境下工作。这时候就面临一个难题:如何让这些非ROS环境与ROS 2系统…...
课堂笔记4月2日
1、计算机核心资源 CPU: 计算(lscpu)内存: 缓存数据(掉电丢失)硬盘: 持久化存储数据网络: 传播数据 2、查看 CPU 信息# 查看CPU[rootC001 ~]# lscpu Architecture: x86_64 CPU op-mod…...
免费方法和付费工具处理顽固AI率,差距有多大
顽固AI率,有没有必要付费? 这个问题的答案,取决于你有多少时间,以及你能接受多少不确定性。这篇文章用数据说话。 免费方法:自己改写 方法:自己逐段阅读,换词改句,加口语化表达 …...
MATLAB绘图中文乱码终极解决方案:3种方法让你的图表告别方框
MATLAB绘图中文乱码终极解决方案:3种方法让你的图表告别方框 科研图表中的中文显示问题一直是MATLAB用户的痛点。当精心准备的论文图表出现"口口口"方框时,不仅影响数据呈现效果,更可能让研究成果的专业性大打折扣。本文将深入剖析…...
INS与GPS组合导航EKF算法代码功能说明
三维的组合导航。 ins和卫星的组合导航算法,基于卡尔曼滤波和eskf滤波的都有。 MATLAB源码,有kf和eskf的对比,也有单独的误差,或者输入滤波之后的位移速度等导航参数。 这段程序主要是一个卡尔曼滤波器,用于估计运动物…...
