对比解析php和go对JSON处理的区别

news2025/7/21 1:27:12

一、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 main

import (
	"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 Data
	newArr2.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   int
    sex   string  //小写的字段不可导出,所以无法序列化
    Class *Class `json:"class"`
}

type Class struct {
    Name  string
    Grade int
}

func main() {
    //实例化一个数据结构,用于生成json字符串
    stu := Stu{
        Name: "张三",
        Age:  18,
        sex:  "男",
    }

    //指针变量
    cla := new(Class)
    cla.Name = "1班"
    cla.Grade = 3
    stu.Class=cla

    jsonStu, 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  string
    Grade 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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

word文档中宏的使用(使用VBA批量修改表格样式)

1. 找到工具栏中“视图-》宏” 2. 选择“查看宏” 3. 创建/编辑宏 4. 修改“表格背景和设定字体大小”代码 如图&#xff1a; 代码块&#xff1a; Sub 修改表格字体()修改表格字体 宏For i 1 To ActiveDocument.Tables.CountDim t As TableSet t ActiveDocument.Tables(i)…

Maven第九章: Maven插件应用-FTP的插件

Maven第九章: Maven插件应用-FTP的插件 前言 本章内容重点:IDEA中 FTP的插件,以及FTP的插件在IDEA中连接和操作FTP服务器 操作应用。 背景 实际开发过程中,windows 安装相应的编辑工具不方便,我们需要实时上传到Linux服务进行编辑运行,查看效果,IDEA开发工具FTP插件,…

基于算术优化算法的无人机航迹规划-附代码

基于算术优化算法的无人机航迹规划 文章目录 基于算术优化算法的无人机航迹规划1.算术优化搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用算术优化算法来优化无人机航迹规划。 …

iPhone手机如何恢复删除的视频?整理了3个好用方法!

在日常生活中&#xff0c;我们会把各种各样的视频存放在手机里。这些视频记录着我们生活中的点点滴滴&#xff0c;每一帧都承载着珍贵的记忆。但如果我们不小心将这些重要视频删除了该怎么办&#xff1f;如何恢复删除的视频&#xff1f;本文将以iPhone手机为例子&#xff0c;教…

如何选一款适合自己的网页浏览器?-2023

常用的网页浏览器有哪些&#xff0c;电脑上所用的浏览器&#xff0c;通常也都有手机版本的。 网页浏览器是互联网的接口&#xff0c;最基础最核心的人机交互应用。 个人结论&#xff1a; 以mainland china为例&#xff1a; edge>firefox>opera>chrome 关闭不需要的…

彻底解决使用better-scroll不能滚动的问题

better-scroll这个组件不能说有多好&#xff0c;只能说可以拿来用用。但是很多人都碰到了引入这个组件以后&#xff0c;页面反而不能滚动的问题。今天我就来谈谈怎么彻底解决这个问题 首先要谈谈better-scroll页面滚动的原理&#xff1a; 如上图所示&#xff0c;只有当内容高度…

kafka入门教程,介绍全面

1、官网下载最新版本的kafka&#xff0c;里面已经集成zookeeper。直接解压到D盘 2、配置文件修改&#xff0c;config目录下面的zookeeper.properties. 设置zookeeper数据目录 dataDirD:/kafka_2.12-3.6.0/tmp/zookeeper 3、修改kafka的配置文件server.properties. 主要修…

数模竞赛那么累,究竟能给我带来什么?

国赛官网上有这么一句话&#xff1a;一次参赛&#xff0c;终生受益。 学生时代&#xff0c;我对这句话没啥感触。 因为刚开始学数模时感觉很没头绪&#xff0c;书也看不懂&#xff0c;论文也看不懂&#xff0c;看啥都看不懂。 比赛时题目看不懂&#xff0c;答案搜不到&#xf…

百度小程序DIY小程序源码系统+轻松创建百度小程序,实现个性化功能 带完整的搭建教程

在现在大环境的影响下&#xff0c;小程序已经成为人们日常生活中不可或缺的一部分。百度小程序作为国内领先的小程序平台之一&#xff0c;为广大开发者提供了丰富的开发资源和工具。今天源码小编就来给大家分享一款百度小程序DIY小程序源码系统。百度小程序DIY小程序源码系统是…

共享WIFI贴码怎么推广?快速地推技巧揭秘!

在如今高度互联网化的社会中&#xff0c;共享WIFI已经成为人们生活中不可或缺的一部分。然而&#xff0c;创业者想要让自己代理加盟的共享WIFI贴码&#xff0c;获得更多用户和增加收益&#xff0c;就需要进行有效的推广。那么&#xff0c;共享WIFI贴码该如何推广呢&#xff1f;…

pycharm安装教程-pycharm安装详细步骤(Mac版)

之前跟大家讲了怎么安装Python&#xff0c;这期跟大家介绍个很好用的编程工具–pycharm。 PyCharm是一种Python IDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单…

cut 命令

cut [选项参数] filename #默认分隔符是制表符 选项参数&#xff1a; -d delimiter 分隔符 -f field 场地、领域&#xff08;第几列&#xff09; 命令使用&#xff1a; cut -d " " -f 1 cut.txt #空格为分隔符截取第1列cut -d " " -f 2,3 cut.txt #截…

众和策略可靠吗?神奇成交量指标公式?

可靠 独特成交量方针公式是出资者们广泛运用的技能方针之一&#xff0c;用于衡量股票交易中的成交量活跃度以及商场心境。在这篇文章中&#xff0c;我们将从多个视点剖析独特成交量方针公式的含义、核算办法、运用场景以及留心事项。 首要&#xff0c;我们需求了解独特成交量…

Google浏览器无法打开设置

文章目录 开启沙箱模式Google重命名 开启沙箱模式 前面有一个空格要注意 --no-sandboxGoogle重命名 其他地方记得同步修改

pyinstaller 含有ultralytics库的代码时候无法打开exe文件,资源文件太多就是个坑。函数内部import库直接打包失败。dll缺失如何解决。

1 问题&#xff1a;基于yolov8开发一个功能&#xff0c;结果打包出现了问题。就是打包完了不是这个包找不到就是那个库找不到。 首先必须要说一下类似yolov8这样子的库&#xff0c;其中包含很多yaml文件&#xff0c;包含文档的路径&#xff0c;这个其实就是个坑。如果你经常打…

2023-ICLR-Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning

2023-ICLR-Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning Paper:https://openreview.net/forum?idlq62uWRJjiY Code:https://github.com/QingruZhang/AdaLoRA 自适应计算分配&#xff0c;实现参数高效微调 为了实现动态地调节Lora的rank的大小&#xff0…

微信小程序去掉Button自带边框

前言 微信button自带边框 去掉边框后效果 实现 html代码 <view><button class"contactBtn" open-type"contact" contact"handleContact"session-from"sessionFrom">意见反馈</button> </view>css代码 …

Stable Diffusion WebUI扩展openpose-editor如何使用

先上地址: GitHub - fkunn1326/openpose-editor: Openpose Editor for AUTOMATIC1111s stable-diffusion-webuiOpenpose Editor for AUTOMATIC1111s stable-diffusion-webui - GitHub - fkunn1326/openpose-editor: Openpose Editor for AUTOMATIC1111s stable-diffusion-webu…

HUMAN TOMATO: T EXT - ALIGNED WHOLE-BODY MOTION GENERATION(2023.10.19)

文章目录 AbstractIntroduction现有工作的不足为了解决上述问题主要贡献 Methodology&#xff08;方法论&#xff09;PROBLEM FORMULATION&#xff08;问题公式化&#xff09;LEARNING DISCRETE WHOLE - BODY REPRESENTATIONS&#xff08;学习离散的全身表征&#xff09;Vanill…

视频平台跨网级联视频压缩解决方案

一、 简介 视频监控领域对带宽有着较大的需求&#xff0c;这是因为视频流需要实时占用网络带宽资源。视频监控的传输带宽是组网结构的基础保障&#xff0c;关系到视频监控的稳定性、可靠性和可拓展性等因素。例如&#xff0c;720P的视频格式每路摄像头的比特率为2Mbps&#xff…