Golang 结构体、Map、切片、普通类型的数据类型的序列化和反序列化

代码案例:

package main

import (
	"encoding/json"
	"fmt"
)

type People struct {
	Name    string `json:"name"` //序列化后的字段名字【自定义】
	Age     int    `json:"age"`
	Address string `json:"address"`
}

func main() {
	//序列化
	TestMarshalStruct()
	TestMarshalMap()
	TestMarshalSlice()
	TestMarshalFloat64()
	//反序列化
	TestUnMarshalStruct()
	TestUnMarshalMarshalMap()
	TestUnMarshalSlice()
}

// 结构体的序列化
func TestMarshalStruct() {
	people := People{
		Name:    "carver",
		Age:     29,
		Address: "beijing",
	}
	data, err := json.Marshal(people)
	if err != nil {
		fmt.Println("序列化错误 err=%v\n", err)
	}
	//序列化的结果
	fmt.Println(string(data))
}

// map的序列化【无序的】
func TestMarshalMap() {
	//定义一个map
	var a map[string]interface{}
	//使用map之前需要make
	a = make(map[string]interface{})
	a["name"] = "孙悟空"
	a["age"] = 123
	a["address"] = "花果山"
	data, err := json.Marshal(a)
	if err != nil {
		fmt.Println("序列化错误 err=%v\n", err)
	}
	//序列化的结果
	fmt.Println(string(data))
}

// 切片的序列化
func TestMarshalSlice() {
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	//使用map前需要make
	m1 = make(map[string]interface{})
	m1["name"] = "carver"
	m1["age"] = 43
	m1["address"] = [2]string{"beijing", "shanghai"}
	slice = append(slice, m1)

	var m2 map[string]interface{}
	//使用map前需要make
	m2 = make(map[string]interface{})
	m2["name"] = "carver1"
	m2["age"] = 55
	m2["address"] = "tianjin"
	slice = append(slice, m2)

	data, err := json.Marshal(slice)
	if err != nil {
		fmt.Println("序列化错误 err=%v\n", err)
	}
	//序列化的结果
	fmt.Println(string(data))
}

// 基本数据类型序列化
func TestMarshalFloat64() {
	var num float64 = 63.9
	data, err := json.Marshal(num)
	if err != nil {
		fmt.Println("序列化错误 err=%v\n", err)
	}
	//序列化的结果
	fmt.Println(string(data))
}

// json字符串反序列化为结构体
func TestUnMarshalStruct() {
	str := "{\"name\":\"carver\",\"age\":29,\"address\":\"beijing\"}"
	//定义一个原来的结构体实例
	var people People
	err := json.Unmarshal([]byte(str), &people)
	if err != nil {
		fmt.Println("unmarshal err=%v", err)
	}
	fmt.Println(people)
}

// json字符串反序列化为map
func TestUnMarshalMarshalMap() {
	str := "{\"address\":\"花果山\",\"age\":123,\"name\":\"孙悟空\"}"
	//定义一个map 	反序列化不用make,make操作被封装到 Unmarshal 函数中了
	var a map[string]interface{}
	err := json.Unmarshal([]byte(str), &a)
	if err != nil {
		fmt.Println("unmarshal err=%v", err)
	}
	fmt.Println(a)
}

// json字符串反序列化为切片
func TestUnMarshalSlice() {
	str := "[{\"address\":[\"beijing\",\"shanghai\"],\"age\":43,\"name\":\"carver\"}," +
		"{\"address\":\"tianjin\",\"age\":55,\"name\":\"carver1\"}]"
	//定义一个slice 	反序列化不用make,make操作被封装到 Unmarshal 函数中了
	var slice []map[string]interface{}
	err := json.Unmarshal([]byte(str), &slice)
	if err != nil {
		fmt.Println("unmarshal err=%v", err)
	}
	fmt.Println(slice)
}

注意:

  • 在反序列化一个json字符串时,要确保反序列化后的数据类型和原来序列化前的数据类型保持一致
  • 程序获取的json字符串不用做其它处理

作者:Carver-大脸猫

出处:https://www.cnblogs.com/carver/articles/18456427

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请注明原处

posted @   Carver-大脸猫  阅读(11)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题