Go Marshal与Unmarshal 结构体和json字符串互转

36 篇文章 3 订阅
21 篇文章 1 订阅

场景1:

客户端请求接口返回json字符串,想将json字符串转成结构体数据、或将结构体数据转成json字符串。

方法:

使用系统模块"encoding/json"的json.Unmarshal方法

假设:

接口响应body内容是response.String() ,如下

{
	Success: true,
	ErrCode: 0,
	ErrMsg: "登录成功",
	Data: main.data {
		Token: "u_8e3e81e1155548e7a894fd2c09bcf571",
		UserId: "-1103",
		NickName: "12000001203",
		Avatar: "https://avatar.xxxxx.com/avatar_5afb03a888c74dbd80f1e24d6d0feed1.jpg",
		Mobile: "12000001203",
		Level: 0,
		FirstRegister: false
	},
	TotalCount: "",
	Code: 0,
	NotSuccess: false,
	Message: "登录成功"
}

代码:

将json字符串数据,转成结构体对应数据字段

// 获取响应body
	println("response.body:",response.String())
	// 获取响应header

	// 获取响应statusCode
	println("response.statusCode:",response.StatusCode)
	// 获取响应header cookie

	// 定义结构体
	type data struct {
		Token string `json:"token"`
		UserId	string `json:"userId"`
		NickName	string `json:"nickname"`
		Avatar	string `json:"avatarUrl"`
		Mobile string `json:"mobile"`
		Level int `json:"level"`
		FirstRegister bool `json:"firstRegister"`
	}
	type Res struct {
		Success bool `json:"success"`
		ErrCode int `json:"errCode"`
		ErrMsg string `json:"errMsg"`
		Data data `json:"data"` // 子节点
		TotalCount string `json:"totalCount"`
		Code int `json:"code"`
		NotSuccess bool `json:"notSuccess"`
		Message string `json:"message"`
	}
	// 实例化结构体
	var res Res
	// json字符串[转]结构体
	err := json.Unmarshal([]byte(response.String()),&res)
	// 
	if err !=nil{
		fmt.Println(err)
	}
	// 
	fmt.Printf("%#v\n",res)// GoJSON2Struct.Teacher{Id:11, Name:"王老师", Age:30, Tno:"t201205"}
	// 获取结构体属性的值
	fmt.Println("res.Success:",res.Success)// 
	fmt.Println("res.ErrCode:",res.ErrCode)// 
	fmt.Println("res.ErrMsg:",res.ErrMsg)// 
	fmt.Println("res.Data.Token:",res.Data.Token)// json字符串对应结构体子结构体节点
	fmt.Println("res.Data.UserId:",res.Data.UserId)// 
	fmt.Println("res.Data.NickName:",res.Data.NickName)// 
	fmt.Println("res.Data.Avatar:",res.Data.Avatar)// 
	fmt.Println("res.Data.Mobile:",res.Data.Mobile)// 
	fmt.Println("res.Data.Level:",res.Data.Level)// 
	fmt.Println("res.Data.FirstRegister:",res.Data.FirstRegister)// 
	fmt.Println("res.TotalCount:",res.TotalCount)// 
	fmt.Println("res.Code:",res.Code)// 
	fmt.Println("res.NotSuccess:",res.NotSuccess)// 
	fmt.Println("res.Message:",res.Message)// 

控制台输出内容

 2.场景2:

客户端请求接口返回json字符串,想将json字符串转成结构体数据、或将结构体数据转成json字符串。

方法:

使用系统模块"encoding/json"的json.Marshal方法

定义结构体,并实例化结构体,将结构体转成json字符串

// 结构体
	type Student struct {
		Id   int	`json:"id"` // 如果变量打上了json标签,如:Name旁边的 `json:"name"` ,那么转化成的json key就用该标签“name”,否则取变量名作为key,如“Age”,“HIgh”。如果定义为小写字母开头 私有属性不能被json包访问
		Name string	`json:"name"`// [注意]如果定义为小写字母开头 私有属性不能被json包访问
		Age  int `json:"age"`	
		Sno  string	`json:"son"`
	}
	
	// 实例化结构体,相当于类的实例化
	var s = Student{
		Id:   11,
		Name: "小王",
		Age:  10,
		Sno:  "n201205",
	}
	fmt.Printf("%#v\n", s) //	GoStructJSON.Student{Id:11, Name:"小王", Age:10, Sno:"n201205"}
	// struct转json字符串
	jsonByte,_ := json.Marshal(s) 
	// json转字符串
	jsonStr := string(jsonByte)
	fmt.Println(jsonStr) //	{"id":11,"name":"小王","age":10,"son":"n201205"}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liyinchi1988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值