go对Json的处理

2023-11-09

目前再前后端传递数据的方式最广泛的引用使用到的就是Json的数据格式;go语言对Json也有一个非常良好的支持

Marshal

生成Json

package main

import (
	"encoding/json"
	"fmt"
)

type Order struct {
	ID string
	Name string
	Quantity int
	TotalPrice float64
}

func main() {

	o := Order{
		ID: "123456",
		Name: "吹风机",
		Quantity: 1,
		TotalPrice: 45,
	}
	bytes, err := json.Marshal(o)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(bytes))
}

在这里插入图片描述

{
    "ID": "123456",
    "Name": "吹风机",
    "Quantity": 1,
    "TotalPrice": 45
}

以上输出的Json就可以再网络上进行传输,绝大部分语言都对Json有良好的支持.但是上面的Json所有的字段名都是首字母大写的,再其他语言上是不多见的,我们希望遵循网络上常用的大小写的使用方式

修改首字母大写

package main

import (
	"encoding/json"
	"fmt"
)

type Order struct {
	id string
	name string
	quantity int
	totalPrice float64
}

func main() {

	o := Order{
		id: "123456",
		name: "吹风机",
		quantity: 1,
		totalPrice: 45,
	}
	bytes, err := json.Marshal(o)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(bytes))
}

在这里插入图片描述
将字段名改成小写以后,生成的Json是{};主要原因是因为再go语言中,首字母大写的都是public,首字母小写的都是private;我们将首字母改成小写后就全部变成了private;再Marshal时是读不到的

tag

package main

import (
	"encoding/json"
	"fmt"
)

type Order struct {
	ID string `json:"id"`
	Name string `json:"name"`
	Quantity int `json:"quantity"`
	TotalPrice float64 `json:"total_price"`
}

func main() {

	o := Order{
		ID: "123456",
		Name: "吹风机",
		Quantity: 1,
		TotalPrice: 45,
	}
	bytes, err := json.Marshal(o)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(bytes))
}

在这里插入图片描述

{
    "id": "123456",
    "name": "吹风机",
    "quantity": 1,
    "total_price": 45
}

我们再每个属性后面都加上了tag,tag其实是没有什么意义的,它的整个go语言的运行中没有什么意义,只是给json.Marshal看的;如果有tag再生成json的时候会按照tag里面的内容替换成大写的属性名.

空串的处理

不过滤空串

package main

import (
	"encoding/json"
	"fmt"
)

type Order struct {
	ID string `json:"id"`
	Name string `json:"name"`
	Quantity int `json:"quantity"`
	TotalPrice float64 `json:"total_price"`
}

func main() {

	o := Order{
		ID: "123456",
		//Name: "吹风机",
		Quantity: 1,
		TotalPrice: 45,
	}
	bytes, err := json.Marshal(o)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(bytes))
}

在这里插入图片描述

{
    "id": "123456",
    "name": "",
    "quantity": 1,
    "total_price": 45
}

我们不对Name进行定义时,生成Json时会生成一个空串,json.Marshal是可以对空串进行过滤的

过滤空串

package main

import (
	"encoding/json"
	"fmt"
)

type Order struct {
	ID string `json:"id"`
	Name string `json:"name,omitempty"`
	Quantity int `json:"quantity"`
	TotalPrice float64 `json:"total_price"`
}

func main() {

	o := Order{
		ID: "123456",
		//Name: "吹风机",
		Quantity: 1,
		TotalPrice: 45,
	}
	bytes, err := json.Marshal(o)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(bytes))
}

在这里插入图片描述

{
    "id": "123456",
    "quantity": 1,
    "total_price": 45
}

我们再tag里面加入omitempty再Marshal时是可以对空串进行过滤的(是否过滤根据实际的应用场景来)

复杂Json的处理

package main

import (
	"encoding/json"
	"fmt"
)

type OrderItem struct {
	ID    string  `json:"id"`
	Name  string  `json:"name"`
	Price float64 `json:"price"`
}

type UserCoupon struct {
	ID    string `json:"id"`
	Title string `json:"title"`
	Used  string `json:"used"`
}

type UserGrade struct {
	ID       string `json:"id"`
	GradeNum int    `json:"grade_num"`
}

type Order struct {
	ID         string      `json:"id"`
	Name       string      `json:"name,omitempty"`
	Quantity   int         `json:"quantity"`
	TotalPrice float64     `json:"total_price"`
	Items      []OrderItem `json:"items"`
	Grade      *UserGrade  `json:"grade"`
	Coupon     UserCoupon  `json:"coupon"`
}

func main() {

	o := Order{
		ID:         "123456",
		Quantity:   1,
		TotalPrice: 65,
		Items: []OrderItem{
			{ID: "123", Name: "吹风机", Price: 45},
			{ID: "124", Name: "台灯", Price: 35},
		},
		Grade: &UserGrade{
			ID: "321", GradeNum: 1,
		},
		Coupon: UserCoupon{
			ID:    "126",
			Title: "满50减15",
			Used:  "店铺优惠券",
		},
	}
	bytes, err := json.Marshal(o)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(bytes))
}

在这里插入图片描述

{
    "id": "123456",
    "quantity": 1,
    "total_price": 65,
    "items": [
        {
            "id": "123",
            "name": "吹风机",
            "price": 45
        },
        {
            "id": "124",
            "name": "台灯",
            "price": 35
        }
    ],
    "grade": {
        "id": "321",
        "grade_num": 1
    },
    "coupon": {
        "id": "126",
        "title": "满50减15",
        "used": "店铺优惠券"
    }
}

json.Marshal支持对复杂Json的处理.包括但不限于数组,Json的嵌套,指针的使用.

Unmarshal

package main

import (
	"encoding/json"
	"fmt"
)

type OrderItem struct {
	ID    string  `json:"id"`
	Name  string  `json:"name"`
	Price float64 `json:"price"`
}

type UserCoupon struct {
	ID    string `json:"id"`
	Title string `json:"title"`
	Used  string `json:"used"`
}

type UserGrade struct {
	ID       string `json:"id"`
	GradeNum int    `json:"grade_num"`
}

type Order struct {
	ID         string      `json:"id"`
	Name       string      `json:"name,omitempty"`
	Quantity   int         `json:"quantity"`
	TotalPrice float64     `json:"total_price"`
	Items      []OrderItem `json:"items"`
	Grade      *UserGrade  `json:"grade"`
	Coupon     UserCoupon  `json:"coupon"`
}

func main() {
	s := `{"id":"123456","quantity":1,"total_price":65,"items":[{"id":"123","name":"吹风机","price":45},{"id":"124","name":"台灯","price":35}],"grade":{"id":"321","grade_num":1},"coupon":{"id":"126","title":"满50减15","used":"店铺优惠券"}}`
	var o Order
	err := json.Unmarshal([]byte(s), &o)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%+v\n",o)
}

在这里插入图片描述
将Json转换成struct用json.Unmarshal就可以了,go语言对解析Json有同样良好的支持,再解析的时候要注意的是一定要把struct的地址传过去,如果将值传过去,那么就是数据的复制,不会影响到自己定义的struct;只有将地址传过去才能完成 正常的解析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go对Json的处理 的相关文章

随机推荐

  • module ‘scipy.misc‘ has no attribute ‘imresize‘

    报错 AttributeError module scipy misc has no attribute imresize 解决方法 使用skimage库 conda install scikit image 注意 scipy misc i
  • 第十六章PHY -基于Linux3.10

    下载地址 http download csdn net detail shichaog 8620701 16 1 PHY 本章和OSI模型中的物理层和数据链路层关系密切 在嵌入式SOC上 通常集成有ARM核和MAC控制器 以及增加数据传输带
  • 信噪比和信干噪比

    1 信噪比 即香农公式 信道容量公式 中的S N C B log 2
  • java和javascript区别_java和javascript之间有什么区别

    java和javascript之间有什么区别 本篇文章就给大家介绍java和javascript之间的区别 让大家了解java和javascript是什么 它们之间的差异有哪些 有一定的参考价值 有需要的朋友可以参考一下 希望对你们有所帮助
  • 数据库实验——数据表的导入导出

    管理数据表 创建表的目在于利用表进行数据的存储和管理 对数据进行管理的前提是数据的存储 向表中添加数据 没有数据的表是没有任何实际意义的 添加完成后 用户也可以根据自己的需要对表中数据进行修改和删除 在SQL Server 2008中 对于
  • PowerDesigner显示汉字表名和英文表名

    菜单 gt Tool gt Model Options gt Name Convention gt 右侧display中选择显示name还是code 不支持同时显示 但可以选择显示code 然后将name填入stereotype中 变相同时
  • torchtext建立词表build_vocab()时使用自己的word2vec模型

    代码如下 如果对于torchtext本身不太了解 可以参考 torchtext处理文本数据 构造dataset读取文本 学习一 torchtext处理文本数据 构造dataset读取文本 学习一 from torchtext import
  • Java运行机制及运行过程

    Java核心机制 Java虚拟机 JVM Java Virtual Machine JVM是一个虚拟的计算机 具有指令集并使用不同的存储区域 负责执行指令 管理数据 内存 寄存器 包含在JDK中 对于不同的平台 有不同的虚拟机 Java虚拟
  • Java开发必学!kafka从入门到精通

    四面阿里 面试岗位是研发工程师 直接找蚂蚁金服的大佬进行内推 参与了阿里巴巴中间件部门的提前批面试 一共经历了四次面试 拿到了口头offer 一面 自我介绍 项目中做了什么 难点呢 Java的线程池说一下 各个参数的作用 如何进行的 Red
  • Could NOT find CUDNN: Found unsuitable version “..“, but required is at least “6“

    现象 在编译cuda版本的opencv4 1时 使用cmake配置时找不到cudnn 实际已安装 原因 由于安装的cudnn版本为8 2 原先记录cudnn版本的宏定义 CUDNN MAJOR和CUDNN MINOR 由cudnn h 移动
  • python--数据分析pandas

    1 pandas概述 Pandas是进行科学数据分析中另一个比较常用的数据库 基于NumPy 但加入了更多的高级数据结构以及操作工具 进一步简化了NumPy等运算与应用 1 1安装 pip install pandas 可以通过import
  • mysql主备 jdbc链接_mysql8 参考手册-使用JDBC配置连接的服务器故障转移

    MySQL Connecto J支持服务器故障转移 当基础活动连接发生与连接有关的错误时 将发生故障转移 连接错误 默认情况下 传递给客户端 其中有通过处理它们 例如 重新创建工作对象 Statement ResultSet 等 并重新启动
  • 线程结束的三种方式

    停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作 也就是放弃当前的操作 在 Java 中有以下 3 种方法可以终止正在运行的线程 使用退出标志 使线程正常退出 也就是当 run 方法完成后线程中止 使用 stop 方法强行终止线
  • QT之paintEvent事件

    当发生一下情况时会产生绘制事件并调用paintEvent 函数 1 在窗口部件第一次显示时 系统会自动产生一个绘图事件 从而强制绘制这个窗口部件 2 当重新调整窗口部件的大小时 系统也会产生一个绘制事件 3 当窗口部件被其他窗口部件遮挡 然
  • 解决小程序无法正常显示.webp格式图片的问题

    在小程序开发过程中可能会出现 微信开发者可以正常显示图片 而用iPhone预览或真机调试的时候却没有显示图片 的问题 有可能是因为图片格式iOS不支持所导致 将其图片格式转为 jpg格式即可 解决方法 判断系统是否为iOS 是 可用正则替换
  • 设备管理器没有生物识别解决方法

    Windows11的设备管理器中未显示生物识别设备 Win 电脑技术网 it资讯 游戏攻略 手机教程 电脑教程 无线路由器设置 设置无线路由器 办公软件教程 电脑系统安装 电脑维修知识 tagxp com
  • Flutter如何做到网络请求(多个网络请求)完成之后再加载页面

    很多时候我们有这样一个需求 需要在网络请求完了之后再去渲染页面 尤其是在一个界面有多个相关网络请求的时候需要处理 这里不得不提到一个系统的组件FutureBuilder 我们直接来看用法 FutureBuilder用法 单网络请求 避免重复
  • Jquery实现网页跳转或用命令打开指定网页!

    Jquery实现网页跳转或用命令打开指定网页 location href www baidu com location href aa aspx 在新窗口中打开链接 window open http www baidu com
  • oracle查看表空间及大小

    1 查看表空间的名称及大小 SELECT t tablespace name round SUM bytes 1024 1024 0 ts size FROM dba tablespaces t dba data files d WHERE
  • go对Json的处理

    目前再前后端传递数据的方式最广泛的引用使用到的就是Json的数据格式 go语言对Json也有一个非常良好的支持 Marshal 生成Json package main import encoding json fmt type Order