第14章-golang中json相关操作

json

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

golang数据类型序列化 json.Marshal()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// 演示glang数据类型序列化
package main

import (
	"fmt"
	"encoding/json"
	"os"
)

type ColorGroup struct {
    ID     int
    Name   string
    Colors []string
}

// struct序列化
func struct1(){
	group := ColorGroup{
		ID:     1,
		Name:   "Reds",
		Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
	}

	b, err := json.Marshal(group)
	if err != nil {
		fmt.Println("error:", err)
	}
	os.Stdout.Write(b)
	fmt.Println()
}

// map序列化
func mp(){
	var a map[string]interface{}
	a = make(map[string]interface{})
	a["大黄蜂"] = "赛博坦星球"
	a["擎天柱"] = "地球"
	b, err := json.Marshal(a)
	if err != nil {
		fmt.Println("error:", err)
	}
	os.Stdout.Write(b)
	fmt.Println()
}

// slice序列化
func slice1(){
	var slice []map[string]interface{}
	var s1 map[string]interface{}
	s1 = make(map[string]interface{})
	s1["龙珠"] = "龙王"
	s1["七龙珠"] = "七龙王"
	slice = append(slice,s1)

	var s2 map[string]interface{}
	s2 = make(map[string]interface{})
	s2["泰山"] = "五岳"
	s2["华山"] = "武当"
	slice = append(slice,s2)

	b, err := json.Marshal(slice)
	if err != nil {
		fmt.Println("error:", err)
	}
	os.Stdout.Write(b)
	fmt.Println()
}

func main(){
	struct1()
	mp()
	slice1()
}

{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
{"大黄蜂":"赛博坦星球","擎天柱":"地球"}
[{"七龙珠":"七龙王","龙珠":"龙王"},{"华山":"武当","泰山":"五岳"}]

在这里插入图片描述

基本数据类型序列化(意义不大)

// 基本数据类型序列化
func n1(){
	var a int = 10001
	b, err := json.Marshal(a)
	if err != nil {
		fmt.Println("error:", err)
	}
	os.Stdout.Write(b)
}
10001

注意事项

  • 对于结构体的序列化,如果我们希望序列化后的key的名字由我们自己指定那么可以给struct字段指定一个 tag 标签(原理反射)
  • struct字段打tag语法:
    在这里插入图片描述
// 演示反序列化
package main

import (
	"fmt"
	"encoding/json"
	"os"
)
type person struct{
	// 这种加个json tag的方式可以让浏览器选择自己喜欢的格式
	// 反射机制
	Id int `json:"id"`
	Name string `json:"name"`
	Age int	`json:"age"`
}

func serialization(){
	p := person{
		Id : 1,
		Name : "tom",
		Age : 20,
	}
	b, err := json.Marshal(&p)
	if err != nil {
		fmt.Println("error:", err)
	}
	os.Stdout.Write(b)
	fmt.Println()
}

func main(){
	serialization()
}
  • 可以看到结构体json序列化后的字段变为了小写
{"id":1,"name":"tom","age":20}在这里插入代码片

golang中json字符串反序列化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:

  • 反序列化 map 不需要make,因为make操作被封装到了 Unmarshal 函数
  • 在反序列化一个json字符串时,要确保反序列化后的数据类型和原来的序列化前数据类型一致
  • 如果json字符串是通过程序本身获取到的则不需要再对json字符串转义处理
    在这里插入图片描述
// 演示反序列化
package main

import (
	"fmt"
	"encoding/json"
	// "os"
)
type person struct{
	// 这种加个json tag的方式可以让浏览器选择自己喜欢的格式
	// 反射机制
	Id int `json:"id"`
	Name string `json:"name"`
	Age int	`json:"age"`
}

// 将json字符串反序列化为 struct
func serialization(){
	P := "{\"Id\":1,\"Name\":\"tom\",\"Age\":20}" // 对原生json字符串转义处理
	
	var p1 person
	
	err := json.Unmarshal([]byte(P), &p1)
	if err != nil{
		fmt.Println("错误提示: ",err)
	}
	fmt.Println("反序列化为struct结果: ",p1)
}

// 将json字符串反序列化为 map
func serializationmap(){
	P := "{\"Id\":1,\"Name\":\"tom\",\"Age\":20}"
	
	var a1 map[string]interface{}
	
	err := json.Unmarshal([]byte(P), &a1)
	if err != nil{
		fmt.Println("错误提示: ",err)
	}
	fmt.Println("反序列化为map结果   : ",a1)
}

// 将json字符串反序列化为 slice
func sliceserializaation(){
	a := "[{\"七龙珠\":\"七龙王\",\"龙珠\":\"龙王\"}," + 
	"{\"华山\":\"武当\",\"泰山\":\"五岳\"}]"

	var a1 []map[string]interface{}

	err := json.Unmarshal([]byte(a),&a1)
	if err != nil{
		fmt.Println("错误提示: ",err)
	}
	fmt.Println("反序列化为slice结果 : ",a1)
}

func main(){
	serialization()
	serializationmap()
	sliceserializaation()
}
反序列化为struct结果:  {1 tom 20}
反序列化为map结果   :  map[Id:1 Name:tom Age:20]
反序列化为slice结果 :  [map[七龙珠:七龙王 龙珠:龙王] map[华山:武当 泰山:五岳]]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值