当前位置: 首页 > news >正文

对比解析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&#xff1b;DROP DATABASE&#xff1b;ALTER DATABASE","影响行数":"不…...

HTTP和HTTPS本质区别——SSL证书

HTTP和HTTPS是两种广泛使用的协议&#xff0c;尽管它们看起来很相似&#xff0c;但是它们在网站数据传输的安全性上有着本质上的区别。 HTTP是明文传输协议&#xff0c;意味着通过HTTP发送的数据是未经加密的&#xff0c;容易受到拦截、窃听和篡改的风险。而HTTPS通过使用SSL或…...

JS 防抖和节流

防抖&#xff08;debounce&#xff09;和节流&#xff08;throttle&#xff09;是JavaScript中常用的性能优化技术&#xff0c;用于限制某些高频率触发的函数执行次数&#xff0c;减少不必要的计算和网络请求。下面分别介绍防抖和节流的实现方式。 防抖&#xff08;Debounce&am…...

Django开发实例总结(入门级、4.2.6、详细)

目录 概述 Django的核心组件包括 Django的项目结构 创建工程&#xff08;4.2.6&#xff09; 实例一&#xff1a;Hello world 实例二&#xff1a;访问一个自定义主页 实例三&#xff1a;通过登录跳转到主页 实例四&#xff1a;主页添加静态文件&#xff0c;包含js、css、…...

Variations-of-SFANet-for-Crowd-Counting可视化代码

前文对Variations-of-SFANet-for-Crowd-Counting做了一点基础梳理&#xff0c;链接如下&#xff1a;Variations-of-SFANet-for-Crowd-Counting记录-CSDN博客 本次对其中两个可视化代码进行梳理 1.Visualization_ShanghaiTech.ipynb 不太习惯用jupyter notebook, 这里改成了p…...

所有的人机交互都存在不匹配现象

从接受理论的角度来看&#xff0c;就像夫妻一样&#xff0c;所有的人机交互都存在不匹配的现象。 接受理论是一个解释人们如何学习和接受信息的心理模型。该理论认为&#xff0c;当人们学习新信息时&#xff0c;他们会将其与自己已有的知识和经验联系起来&#xff0c;以便更好地…...

LED数码管的静态显示与动态显示(Keil+Proteus)

前言 就是今天看了一下书上的单片机实验&#xff0c;发现很多的器件在Proteus中都不知道怎么去查找&#xff0c;然后想做一下这个实验&#xff0c;尝试能不能实现&#xff0c;LED数码管的两个还可以实现&#xff0c;但是用LED点阵显示器的时候他那个网络标号不知道是什么情况&…...

webGL编程指南 第五章 TexturedQuad_Clamp_Mirror

我会持续更新关于wegl的编程指南中的代码。 当前的代码不会使用书中的缩写&#xff0c;每一步都是会展开写。希望能给后来学习的一些帮助 git代码地址 &#xff1a;空 上一章节中我们学习了如何使用varyting变量绘制图片&#xff0c;本章节&#xff0c;我们学习texParameter…...

【Azure】存储服务:Azure 的存储账户

文章目录 一、前提知识&#xff08;建议了解&#xff09;二、介绍 Azure 存储帐户三、使用 Microsoft Azure 门户创建存储帐户 一、前提知识&#xff08;建议了解&#xff09; 在每一个云厂商中&#xff0c;都有自身的云存储&#xff0c;也有根据不同功能进行区分的不同类型的…...

高等数学啃书汇总重难点(十一)曲线积分与曲面积分

依旧是公式极其复杂恶心的一章&#xff0c;建议是&#xff1a;掌握两种线面积分的计算套路即可&#xff0c;和第8章一样属于同济版教材中最不重要的章节&#xff0c;不会对底层理解做过多考察~ 1.弧长曲线积分的几何意义 2.弧长曲线积分的定义和性质 3.弧长曲线积分的计算方式 …...

【算法专题】双指针—盛最多水的容器

一、题目解析 分析这个题目不难得出一个容积公式 二、算法原理 解法一&#xff1a;暴力枚举&#xff08;超时&#xff09; 套用上述的容积公式&#xff0c;使用两个for循环来枚举出所有可能的情况&#xff0c;再挑出最大值即可&#xff0c;但是这种写法会超时&#xff0c;导致…...

java入门,程序=数据结构+算法

一、前言 在学习java的时候&#xff0c;我印象最深的一句话是&#xff1a;程序数据结构算法&#xff0c;对于写java程序来说&#xff0c;这就是java的入门。 二、java基本数据结构与算法 1、数据类型 java中的数据类型8种基本数据类型&#xff1a; 整型 byte 、short 、int…...

9.MySQL索引的操作

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 索引操作 查询索引 创建主键索引 唯一索引的创建 普通索引的创建 全文索引的创建 删除索引 索引创建原则 索引操作 查询索引 第一种方法&#xff1a; show keys from 表名\G 我们了解其中几个就好。 第二种方法…...

大型加油站3d全景虚拟现实展示平台实现全方位立体呈现

近年来&#xff0c;随着国民经济的快速发展&#xff0c;交通基础设施的不断改善&#xff0c;机动车保有量的持续飙升&#xff0c;以至于加油站的建设数量和密度也在不断扩张。加油站作为人流量大且常见的城市场景&#xff0c;对加油站进行安全防范措施具有非常重要的安全意义。…...

Reading:Deep dive into the OnPush change detection strategy in Angular

原文连接&#xff1a;IndepthApp 今天深入阅读并总结Angualr中onPush更新策略。 1. 两种策略 & whats Lview&#xff1f; Angular 实现了两种策略来控制各个组件级别的更改检测行为。这些策略定义为Default和OnPush&#xff1a; 被定义为枚举&#xff1a; export enum…...

野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍

STM32入门——基于野火 F407 霸天虎课程学习 前言 博主开始探索嵌入式以来&#xff0c;其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪&#xff0c;不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科…...

@reduxjs/toolkit配置react-redux解决createStore或将在未来被淘汰警告

通常 我们用redux都需要通过 createStore 但目前 你去用它 基本都会被划线 甚至有点厉害的的编辑器 他会直接告诉你这个东西基本快被弃用了 这个应该大家都知道 最好不要用已经被明确未来或弃用的语法 因为一旦弃用这个系统就需要维护 而且说 一般会被淘汰的语法 本身也就是有…...

致敬1024天前的自己

今早打开手机就收到了来自CSDN的消息&#xff0c;哦&#xff0c;距离我发表第一篇技术博客已经过去1024个日夜了。 我第一次发技术博客是我大二做完我第一个网站时写的。因为网站需要上线服务器&#xff0c;涉及到不少linux相关的知识&#xff0c;我在自学的过程中走了不少弯路…...

〖Python网络爬虫实战㊱〗- JavaScript 网站加密和混淆

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度…...

基于单片机设计的电子柜锁

一、前言 随着现代社会的不断发展&#xff0c;电子柜锁的应用越来越广泛。传统的机械柜锁存在一些不便之处&#xff0c;例如钥匙容易丢失、密码容易泄露等问题。设计一款基于单片机的电子柜锁系统成为了一个有趣而有意义的项目。 该电子柜锁系统通过电磁锁作为柜锁的开关&…...

BetterGI:解放双手的5大自动化场景终极解决方案

BetterGI&#xff1a;解放双手的5大自动化场景终极解决方案 【免费下载链接】better-genshin-impact &#x1f4e6;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自动烹饪…...

【AI问答/前端】前端满天过海局(一)

Axios感觉就像一堆ajax函数,再高深我就不懂了&#xff0c;Pinia可以当成是各组件之间的变量主动响应?这边改了,那边用到这个变量的也变了?跟vue插件传参不一样吧,感觉,vue还要写插槽传值(好像是这样,太久我忘了)。router这个路由我就蛋疼了,他上面的url是真变了呀,他是客户端…...

Kubernetes可观测性体系构建:全面监控与故障排查指南

Kubernetes可观测性体系构建&#xff1a;全面监控与故障排查指南 一、可观测性概述 可观测性&#xff08;Observability&#xff09; 是指通过系统产生的数据来理解系统内部状态的能力。在Kubernetes中&#xff0c;可观测性体系包含三个核心维度&#xff1a;指标&#xff08;…...

DeepSeek总结的DuckDB动态函数应用插件

来源&#xff1a;https://github.com/teaguesterling/duckdb_func_apply DuckDB FuncApply 扩展 DuckDB 的动态函数应用 - 在运行时通过名称调用函数。 概述 FuncApply 扩展为 DuckDB 提供了动态函数调用能力&#xff0c;允许您&#xff1a; 使用 apply() 通过名称调用任何…...

谷歌内部CSR策划SOP首次流出(非公开版):含风险预判矩阵、利益相关方触达热力图与监管审计应答话术库

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Gemini CSR活动策划的底层逻辑与战略定位 Gemini CSR&#xff08;Corporate Social Responsibility&#xff09;活动并非孤立的品牌传播动作&#xff0c;而是深度嵌入企业技术价值观与长期可持续发展框架的战…...

DeepSeek流式响应提速73%的底层逻辑:从Token缓冲区到GPU显存调度的全链路拆解

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek流式响应提速73%的工程现象与性能基线 在真实生产环境中对 DeepSeek-R1 模型实施流式响应优化后&#xff0c;端到端首 token 延迟&#xff08;Time to First Token, TTFT&#xff09;从平均 482ms 降至…...

美团mtgsig签名环境模拟:Android Native层风控对抗实战

1. 这不是写个JS就能跑通的事&#xff1a;为什么mtgsig签名环境模拟是逆向工程里最硬的骨头“美团外卖mtgsig签名”这八个字&#xff0c;在安卓逆向、风控对抗、自动化测试圈子里&#xff0c;几乎等同于一道分水岭。它不像普通API签名那样靠抓包改参就能绕过&#xff0c;也不像…...

AI Security Agent:嵌入CI/CD的自动化安全协作者

1. 这不是又一个“AI安全”的概念炒作&#xff0c;而是DevSecOps流水线里正在静默替换人工的三个关键岗位你有没有在凌晨两点收到过这样的告警邮件&#xff1a;「CI/CD流水线第472次构建失败——SonarQube检测到Critical级SQL注入漏洞&#xff0c;阻断发布」&#xff1f;紧接着…...

3分钟掌握Ditto:物联网设备管理的数字孪生革命

3分钟掌握Ditto&#xff1a;物联网设备管理的数字孪生革命 【免费下载链接】ditto Eclipse Ditto™: Digital Twin framework of Eclipse IoT - main repository 项目地址: https://gitcode.com/gh_mirrors/ditto6/ditto 还在为管理成千上万的物联网设备而头疼吗&#x…...

yuzu模拟器完全指南:解决PC上畅玩Switch游戏的5大难题

yuzu模拟器完全指南&#xff1a;解决PC上畅玩Switch游戏的5大难题 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu是目前最受欢迎的开源任天堂Switch模拟器&#xff0c;让你能够在Windows、Linux和Android设备…...