go语言与JSON

go语言与JSON

1. 字节序复习

大端法:高存低,低存高

小端法:高存高,低存低

2. 序列化

func Marshal(v interface{}) ([]byte, error)
  • 参数:待序列化的数据
  • 返回值:json串

2.1 结构体序列化

  • 要求 结构体类型名 和 成员(属性)名 必须大写(包作用域),才能在json包中可见。(因为json的函数是在其他包中,必须要让其他包可见要转换的结构体)

  • 否则,不报错!但不做序列化转换。

    {“Name”:“张三”,“Age”:29,“Score”:98.9,“Id”:1001}

// 结构体序列化
func StructSerial(v interface{}) {
	jStr, err := json.Marshal(v)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jStr))
}

2.2 map序列化

  • 定义map变量,不使用make初始化,不能存储数据

    {“Age”:19,“Id”:9527,“Name”:“华安”,“food”:[“鸡翅膀”,“含笑半步癫”,“一日散命散”]}

// map 序列化
func MapSerial() {
	var m map[string]interface{}   // key是string类型, value是自定义数据类型
	// 初始化空间
	m = make(map[string]interface{})    // 不指定大小可以自动添加后扩容

	m["Name"] = "华安"
	m["Age"] = 19
	m["Id"] = 9527
	m["food"] = [3]string{"鸡翅膀", "含笑半步癫", "一日散命散"}

	jStr, err := json.Marshal(m)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jStr))
}

2.3 slice切片序列化

  • 定义一个slice变量可以不初始化, 直接使用append()向其中添加数据, slice本质是一个结构体
[
    {
        "Age":19,
        "Id":9527,
        "Name":"华安",
        "food":[
            "鸡翅膀",
            "含笑半步癫",
            "一日散命散"
        ]
    },
    {
        "Age":16,
        "Id":521,
        "Name":"秋香",
        "food":[
            "鸡翅膀",
            "一日散命散"
        ],
        "教师":{
            "Name":"alin",
            "Age":21,
            "Addr":"天津"
        }
    }
]
func SliceSerial() {
	// 定义一个map切片
	var slice []map[string]interface{}

	// 初始化map数据
	m1 := make(map[string]interface{})
	m1["Name"] = "华安"
	m1["Age"] = 19
	m1["Id"] = 9527
	m1["food"] = [3]string{"鸡翅膀", "含笑半步癫", "一日散命散"}

	m2 := make(map[string]interface{})
	m2["Name"] = "秋香"
	m2["Age"] = 16
	m2["Id"] = 521
	m2["food"] = []string{"鸡翅膀", "一日散命散"}
	m2["教师"] = Teacher{"alin", 21, "天津"}

	slice = append(slice, m1)
	slice = append(slice, m2)

	jStr, err := json.Marshal(slice)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jStr))
}

3. 结构体标签

  • 用途:在序列化时,重新制定json key值

  • 语法:使用反引号包裹。key:value

    • key : json、自定义key
    • value:必须使用""包裹
`json:"标签,选项"`

注意:上述语法中不能有空格

标签后面的选项

  • -作用是不进行序列化,
  • omitempty作用是忽略0和空指
  • string作用是序列化时类型转化为字符串,序列化后会有""
package main

import (
	"encoding/json"
	"fmt"
)

//type Student5 struct {
//	Name string `json:"stu_name"`
//	Age int `json:"stu_age"`
//	Score float64
//	Id int
//}

type Student5 struct {
	Name string `json:"-"`    // 序列化结果中没有这个属性
	Age int `json:"age,omitempty"`
	Score float64 `json:"score,string"`
	Id int `json:"id"`
}

// 结构体序列化
func StructSerial1(v interface{}) {
	jStr, err := json.Marshal(v)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jStr))
}

func main() {
	stu := Student5{"张三", 0, 98.9, 1001}
	StructSerial1(stu)
}

输出结果:{"score":"98.9","id":1001}

4. 反序列化

func Unmarshal(data []byte, v interface{}) error
  • 参数1:序列化后产生的json串
  • 参数2:用来传出反序列化后的原始数据。使用时传指针。
  • 返回值:一旦err有数据,说明反序列化失败。

4.1 结构体反序列化

  • 用来接收反序列化的结构体类型,不许与原序列化的结构体类型严格一致
type Student6 struct {
	Name string
	Age int
	Score float64
	Id int
}

type Student7 struct {
	Name string `json:"-"`    // 序列化结果中没有这个属性
	Age int `json:"age,omitempty"`
	Score float64 `json:"score,string"`
	Id int `json:"id"`
}

func StructUnSerial() {
	str := `{"Name":"张三","Age":29,"Score":98.9,"Id":1001}`

	var stu Student6

	err := json.Unmarshal([]byte(str), &stu)
	if err != nil {
		panic(err)
	}
	fmt.Println(stu)
}

func StructUnSerial2() {
	str := `{"score":"98.9","id":1001}`

	var stu Student7

	err := json.Unmarshal([]byte(str), &stu)
	if err != nil {
		panic(err)
	}
	fmt.Println(stu)
}

func main() {
	StructUnSerial()
	StructUnSerial2()
}

{张三 29 98.9 1001}
{ 0 98.9 1001}

4.2 map反序列化

Unmarshal函数会帮助我们做map的容量make操作,用来接收的map不用自己make

  • 需要传取地址的map
func MapDeSerial() {
	str := `{"Age":19,"Id":9527,"Name":"华安","food":["鸡翅膀","含笑半步癫","一日散命散"]}`
	var m map[string]interface{}

	err := json.Unmarshal([]byte(str), &m)
	if err != nil {
		panic(err)
	}
	fmt.Println(m)
}

4.3 slice反序列

  • 需要传入取地址的slice
func SliceDeSerial() {
	str := `[
    {
        "Age":19,
        "Id":9527,
        "Name":"华安",
        "food":[
            "鸡翅膀",
            "含笑半步癫",
            "一日散命散"
        ]
    },
    {
        "Age":16,
        "Id":521,
        "Name":"秋香",
        "food":[
            "鸡翅膀",
            "一日散命散"
        ],
        "教师":{
            "Name":"alin",
            "Age":21,
            "Addr":"天津"
        }
    }
	]`

	var slice []map[string]interface{}

	err := json.Unmarshal([]byte(str), &slice)
	if err != nil {
		panic(err)
	}
	for _, data := range slice {
		fmt.Println(data)
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 语言中,我们可以使用内置的“encoding/json”包来处理 JSON 数据。首先,我们需要定义一个结构体类型,该结构体的字段与 JSON 数据中的键名相对应。然后,我们可以使用 json.Unmarshal() 方法将 JSON 数据解析到这个结构体中,或者使用 json.Marshal() 方法将结构体转换为 JSON 数据。下面是一个简单的示例代码: ``` package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Address string `json:"address,omitempty"` } func main() { jsonData := `{"name":"Alice","age":26,"address":"China"}` var p Person err := json.Unmarshal([]byte(jsonData), &p) if err != nil { fmt.Println("error:", err) } fmt.Println(p.Name) fmt.Println(p.Age) newJsonData, err := json.Marshal(p) if err != nil { fmt.Println("error:", err) } fmt.Println(string(newJsonData)) } ``` 这个代码定义了一个名为“Person”的结构体类型,它有三个字段:Name、Age 和 Address。其中,Name 和 Age 字段映射到 JSON 数据中的“name”和“age”键,而 Address 字段则映射到 JSON 数据中的“address”键。在main函数中,我们将一个 JSON 字符串解析为一个 Person 对象,然后打印出 Name 和 Age 字段的值,并将这个对象转换回 JSON 数据,并打印出来。注意,Address 字段有一个“omitempty”的标记,表示如果 Address 字段的值为空,则在序列化为 JSON 数据时会忽略这个字段。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值