Golang实现JSON编解码(含结构体标签)

前言 

   在网络中以JSON编码的格式传输数据
   发送方 将结构体变量编码为JSON字符串
   接收方 将JSON字符串解码为结构体变量

核心步骤

创建一个结构体变量并赋值

将其编码为JSON编码格式

再将解码为结构体变量格式

详细代码加注释 

package main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Id     int
	Name   string
	Age    int
	gender string //小写
}

func main() {
	//在网络中以JSON编码的格式传输数据
	//发送方 将结构体变量编码为JSON字符串
	//接收方 将JSON字符串解码为结构体变量
	lily0 := Student{
		Id:     1,
		Name:   "lily",
		Age:    20,
		gender: "女士",
	}

	//将结构体变量编码为JSON字符串
	encodeInfo, err := json.Marshal(&lily0)

	if err != nil {
		fmt.Println("json.Marshal err:", err)
		return
	}

	//打印JSON编码 发现gender变量没有显示
	//说明小写字母开头的变量在编码成JSON时会被忽略
	//大写字母开头的变量名表示公有权限
	//小写字母开头的变量名表示私有权限
	fmt.Println("encodeInfo:", string(encodeInfo))

	//将JSON字符串解码为结构体变量
	//创建一个相同的结构体对象用来储存解码的结果
	var lily1 Student
	err = json.Unmarshal([]byte(encodeInfo), &lily1)

	if err != nil {
		fmt.Println("json.Unmarshal err:", err)
		return
	}

	fmt.Println(lily1)
}

注意点 

    打印JSON编码 发现gender变量没有显示
    说明小写字母开头的变量在编码成JSON时会被忽略
    大写字母开头的变量名表示公有权限(可以在其他的package中访问)

    小写字母开头的变量名表示私有权限 (只能在本package中访问)

效果展示(终端显示的内容)

PS D:\Projects\GolangProjects\workspace\src> go run .\http\json.go
encodeInfo: {"Id":1,"Name":"lily","Age":20}
{1 lily 20 }

PS D:\Projects\GolangProjects\workspace\src>

结构体标签

在结构体中字段后面 用 反引号(通常位于键盘左上角)

type Teacher struct {
   Name    string `json:"-"`           //指定这个变量不参与JSON编码
   Subject string `json:"subjectName"` //指定字段在JSON编码中的别名
   Age     int    `json:"age,string"`  //指定字段的别名并修改字段类型

   Address string `json:"address,omitempty"` //空字段自动忽略

   gender  string //小写字母开头的变量名 会被JSON编码忽略
}

package main

import (
	"encoding/json"
	"fmt"
)

type Teacher struct {
	Name    string `json:"-"`           //指定这个变量不参与JSON编码
	Subject string `json:"subjectName"` //指定字段在JSON编码中的别名
	Age     int    `json:"age,string"`  //指定字段的别名并修改字段类型
    Address string `json:"address,omitempty"` //空字段自动忽略
	gender  string //小写字母开头的变量名 会被JSON编码忽略
}

func main() {

	lily := Teacher{
		Name:    "lily",
		Subject: "Golang",
		Age:     30,
		gender:  "男士",
	}

	fmt.Println("lily:", lily)

	encodeInfo, _ := json.Marshal(&lily)

	fmt.Println("encodeInfo:", string(encodeInfo))
}

效果展示(终端显示的内容)

PS D:\Projects\GolangProjects\workspace\src> go run .\http\json.go
lily: {lily Golang 30  男士}
encodeInfo: {"subjectName":"Golang","age":"30"}(引号内的30表示字符串格式
PS D:\Projects\GolangProjects\workspace\src>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

没伞的男孩

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值