Golang-json02(演示struct, map,slice 序列化)

本文详细介绍了Go语言中json序列化的使用,包括struct、map和slice的序列化方法。通过示例代码展示了如何将数据结构转换为json字符串,并讨论了在序列化过程中需要注意的细节,如自定义字段名称和处理基本数据类型的序列化问题。
摘要由CSDN通过智能技术生成

json序列化是将有key-val结构的数据类型,序列化成json字符串。

struct序列化

encoding/json包中的func Marshal(v interface{}) ([]byte, error),接收一个空接口,即可以接收任何类型的数据,返回字符切片

package main
import(
	"fmt"
	"encoding/json"
)
type Monster struct{
	Name string
	Age int
	Sal float64
	Skill string
}
func testTruct(){

	monster := Monster{
		Name : "牛魔王",
		Age : 500,
		Sal : 1400.50,
		Skill : "元气斩",
	}
	//将结构体序列化
	data, err := json.Marshal(&monster)
	if err!= nil{
		fmt.Printf("序列号错误 err=%v\n",err)
	}
	fmt.Printf("monster 序列化后 = %v\n",string(data))
	//string()将数字切片转换成键值对
}

func main(){
	testTruct()
}
输出结果
monster 序列化后 = {"Name":"牛魔王","Age":500,"Sal":1400.5,"Skill":"元气斩"}

map序列化

func testMap(){
	//测试map序列化
	//map[string]interface{}的意思是value值可以是任意
	//类型
	var a map[string]interface{}
	//使用map需要make
	a = make(map[string]interface{})
	a["name"] = "卡卡罗特"
	a["age"] = 45
	a["skill"] = "界王拳"
	//也可以a["skill"] = [2]string{"龟派气功", "爆气"}
	//回顾数值表示形式

	data, err:= json.Marshal(a)
	//知识点:map本身就是引用,不用再加&取地址
	if err!= nil{
		fmt.Printf("序列号错误 err=%v\n",err)
	}
	fmt.Printf("a map 序列化后 = %v\n",string(data))
}

slice序列化

func testSlice(){
	//声明一个切片,切片元素是切片类型
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	//使用map前,现需要make
	m1 = make(map[string]interface{})
	m1["Fname"] = "jack"
	m1["Lname"] = "ma"
	slice = append(slice, m1)
	//知识点,动态增加slice
	var m2 map[string]interface{}
	//使用map前,现需要make
	m2 = make(map[string]interface{})
	m2["Fname"] = "jack"
	m2["Lname"] = "chen"
	slice = append(slice, m2)
	data, err:= json.Marshal(slice)
	if err!= nil{
		fmt.Printf("序列号错误 err=%v\n",err)
	}
	fmt.Printf("a map 序列化后 = %v\n",string(data))
}

基本数据类型

对基本数据类型序列化意义不大,序列之后是一个字符串

补充知识

monster := Monster{
		Name : "牛魔王",  //这边Name是大写,而web浏览器接受
		Age : 500,		 //可能需要小写的name
		Sal : 1400.50,
		Skill : "元气斩",
	}
//解决办法:在定义时可以加一个自定义的tag
type Monster struct{
	Name string  `json:"name"` //这边用了Golan的反射机制
	Age int
	Sal float64
	Skill string
}	

注意:不能直接在struct定义时用 name string 形式,因为json包与当前的main包属于跨包调用,小写name不能跨包使用,序列化时会被丢弃但不报错,所以只能使用tag形式改名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值