golang基础-json序列化、反序列化、自定义error

2024-08-31 22:48

本文主要是介绍golang基础-json序列化、反序列化、自定义error,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        • json协议
        • 结构体转json
        • map转json
        • int转json
        • slice转json
        • json反序列化为结构体
        • json反序列化为map
        • 自定义error

json协议
结构体转json
package mainimport ("fmt""encoding/json")type User struct {UserName string `json:"username"`NickName string `json:"nickname"`Age      intBirthday stringSex      stringEmail    stringPhone    string
}
/*结构体转json*/func testStruct() {user1 := &User{UserName: "user1",NickName: "上课看似",Age:      18,Birthday: "2008/8/8",Sex:      "男",Email:    "mahuateng@qq.com",Phone:    "110",}data, err := json.Marshal(user1)if err != nil {fmt.Printf("json.marshal failed, err:", err)return}fmt.Printf("%s\n", string(data))
}func main() {testStruct()fmt.Println("----")
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
{"username":"user1","nickname":"上课看似","Age":18,"Birthday":"2008/8/8","Sex":"男","Email":"mahuateng@qq.com","Phone":"110"}
----
PS E:\golang\go_pro\src\safly>
map转json
package mainimport ("fmt""encoding/json")type User struct {UserName string `json:"username"`NickName string `json:"nickname"`Age      intBirthday stringSex      stringEmail    stringPhone    string
}
/*map转json*/func testMap() {var mmp  map[string]interface{}mmp = make(map[string]interface{})mmp["username"] = "user"mmp["age"] = 19mmp["sex"] = "man"data,err := json.Marshal(mmp)if err != nil{fmt.Println("json marshal failed,err:",err)return}fmt.Println("%s\n",string(data))
}func main() {testMap()fmt.Println("----")
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
{"age":19,"sex":"man","username":"user"}
----
PS E:\golang\go_pro\src\safly>
int转json
package mainimport ("fmt""encoding/json")type User struct {UserName string `json:"username"`NickName string `json:"nickname"`Age      intBirthday stringSex      stringEmail    stringPhone    string
}
/*slice转json*/func testSlice() {}func testInt() {var age = 100data, err := json.Marshal(age)if err != nil {fmt.Printf("json.marshal failed, err:", err)return}fmt.Printf("%s\n", string(data))
}func main() {testSlice()testInt()fmt.Println("----")
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
100
----
PS E:\golang\go_pro\src\safly>
slice转json
package mainimport ("fmt""encoding/json")func testSlice() {var m map[string]interface{}var s []map[string]interface{}m = make(map[string]interface{})m["username"] = "user1"m["age"] = 18m["sex"] = "man"s = append(s, m)m = make(map[string]interface{})m["username"] = "user2"m["age"] = 29m["sex"] = "female"s = append(s, m)data, err := json.Marshal(s)if err != nil {fmt.Printf("json.marshal failed, err:", err)return}fmt.Printf("%s\n", string(data))
}func main() {testSlice()}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
[{"age":18,"sex":"man","username":"user1"},{"age":29,"sex":"female","username":"user2"}]
PS E:\golang\go_pro\src\safly>
json反序列化为结构体
package mainimport ("encoding/json""fmt"
)type User struct {UserName string `json:"username"`NickName string `json:"nickname"`Age      intBirthday stringSex      stringEmail    stringPhone    string
}func testStruct() (ret string, err error) {user1 := &User{UserName: "user1",NickName: "上课看似",Age:      18,Birthday: "2008/8/8",Sex:      "男",Email:    "mahuateng@qq.com",Phone:    "110",}data, err := json.Marshal(user1)if err != nil {err = fmt.Errorf("json.marshal failed, err:", err)return}ret = string(data)return
}func test() {data, err := testStruct()if err != nil {fmt.Println("test struct failed, ", err)return}var user1 Usererr = json.Unmarshal([]byte(data), &user1)if err != nil {fmt.Println("Unmarshal failed, ", err)return}fmt.Println(user1)
}func main() {test()// test2()
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
{user1 上课看似 18 2008/8/8 男 mahuateng@qq.com 110}
PS E:\golang\go_pro\src\safly>
json反序列化为map
package mainimport ("encoding/json""fmt"
)func testMap() (ret string, err error) {var m map[string]interface{}m = make(map[string]interface{})m["username"] = "user1"m["age"] = 18m["sex"] = "man"data, err := json.Marshal(m)if err != nil {err = fmt.Errorf("json.marshal failed, err:", err)return}ret = string(data)return
}func test2() {data, err := testMap()if err != nil {fmt.Println("test map failed, ", err)return}var m map[string]interface{}err = json.Unmarshal([]byte(data), &m)if err != nil {fmt.Println("Unmarshal failed, ", err)return}fmt.Println(m)
}func main() {test2()
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
map[age:18 sex:man username:user1]
PS E:\golang\go_pro\src\safly>
自定义error
package mainimport ("fmt""os""time"
)type PathError struct {path       stringop         stringcreateTime stringmessage    string
}func (p *PathError) Error() string {return fmt.Sprintf("path=%s op=%s createTime=%s message=%s", p.path,p.op, p.createTime, p.message)
}
/*
type error interface {Error() string
}
*/
func Open(filename string) error {file, err := os.Open(filename)if err != nil {return &PathError{path:       filename,op:         "read",message:    err.Error(),createTime: fmt.Sprintf("%v", time.Now()),}}defer file.Close()return nil
}func main() {err := Open("C:/sdklflakfljdsafjs.txt")switch v := err.(type) {case *PathError:fmt.Println("get path error,", v)default:}}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
get path error, path=C:/sdklflakfljdsafjs.txt op=read createTime=2017-11-05 20:09:23.4928719 +0800 CST message=open C:/sdklflakfljdsafjs.txt: The system cannot find the file specified.
PS E:\golang\go_pro\src\safly>

这篇关于golang基础-json序列化、反序列化、自定义error的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125215

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组