go语言的json详解编程语言

简介

json 中提供的处理 json 的标准包是 encoding/json,主要使用的是以下两个方法:

// 序列化 
func Marshal(v interface{}) ([]byte, error) 
 
// 反序列化 
func Unmarshal(data []byte, v interface{}) error 

1、编码json

可以把一个结构体编码为json,也可以把一个map编码为json

package main 
 
import ( 
	"encoding/json" 
	"fmt" 
) 
 
//编码json,使用json.Marshal()函数可以对一组数据进行json格式的编码 
 
 
//定义 一个结构体 
type Test39Person struct { 
	//这里的属性必须是大写开头 
	Test1 string 
	Test2 string 
 
} 
 
//看下后面的打印就知道什么意思了,实现小写也可以了,这里也可以搞一个匿名变量,不会打印,用- 
type Test39Person1 struct { 
	//这里的属性必须是大写开头 
	Test1 string `json:"-"` 
	Test2 string `json:"hob"` 
 
} 
 
 
 
 
 
func main() { 
	//1、通过结构体生成json 
 
	p := Test39Person{ Test1:"abc", Test2:"ate"} 
 
	p2 := Test39Person1{ Test1:"abc", Test2:"ate"} 
 
	fmt.Println(p) 
	//1、生成json文本 
	b,e := json.Marshal(p) 
	if e != nil { 
		fmt.Println(e) 
	} 
	fmt.Println(string(b)) 
	//{"Test1":"abc","Test2":"ate"} 
 
 
	//2、生成格式化json 
	//prefix是前缀的意思,indent 
	c,e := json.MarshalIndent(p,"*","     ") 
	fmt.Println(string(c)) 
 
	//{ 
	//	*     "Test1": "abc", 
	//	*     "Test2": "ate" 
	//	*} 
 
 
	c,e = json.MarshalIndent(p2,"*","     ") 
	fmt.Println(string(c)) 
	//{ 
	//	*     "hob": "ate" 
	//	*} 
 
	//3、通过map生成json 
//interface这个表示任意类型 
	nnp := make(map[string]interface{}) 
	nnp["name"] = "ccc" 
	nnp["age"] = 12 
	nnp["hob"] = true 
 
	f,e := json.Marshal(nnp) 
	if e != nil { 
		fmt.Println(e) 
	}else { 
		fmt.Println(string(f)) 
		//{"age":12,"hob":true,"name":"ccc"} 
	} 
 
 
} 

  

2、解码json

可以解码到结构体,也可以解码到接口

package main 
 
import ( 
	"encoding/json" 
	"fmt" 
	"reflect" 
) 
 
//解码json 
type Test40Person struct { 
	//这里的属性必须是大写开头 
	Test1 string 
	Test2 string 
 
} 
func main() { 
	//准备一段json 
	b := []byte(`{"Test1":"abc","Test2":"ate"}`) 
 
	//把json解析到结构体 
	var t Test40Person 
 
	e := json.Unmarshal(b,&t) 
	if e != nil { 
		fmt.Println(e) 
	} 
	fmt.Println(t,reflect.TypeOf(t)) 
	//{abc ate} main.Test40Person 
 
 
	//解析到接口,解析出来的数据是map 
	var i interface{} 
 
	err := json.Unmarshal(b,&i) 
	if err != nil { 
		fmt.Println(err) 
	} 
	fmt.Println(i,reflect.TypeOf(i)) 
	//map[Test1:abc Test2:ate] map[string]interface {} 
 
 
 
	//调用interface的json,可以判断类型 
	m := i.(map[string]interface{}) 
	for k,v := range m { 
		switch vv := v.(type) { 
		case string: 
			fmt.Println(k,"是string类型",vv) 
		case int: 
			fmt.Println(k,"是int类型",vv) 
		default: 
			fmt.Println(k,"是其他类型",vv) 
		} 
 
	} 
 
} 

  

1、序列化为结构体为json,采用json.Marshal()方法

package main 
 
import ( 
	"encoding/json" 
	"fmt" 
	"reflect" 
) 
 
//定义一个结构体 
type Test5Person struct { 
	Test1 string 
	Test2 byte 
	Test3 bool 
	Test4 int 
} 
 
 
 
func main()  { 
	//将一个结构体序列化为json 
	t5_1 := Test5Person{Test1:"aaa",Test2:'b',Test3:false,Test4:12} 
	fmt.Println(t5_1) 
	//{aaa 98 false 12} 
	d,e := json.Marshal(t5_1) 
	if e != nil { 
		fmt.Println(e) 
	}else { 
		fmt.Println(string(d),reflect.TypeOf(d)) 
		//{"Test1":"aaa","Test2":98,"Test3":false,"Test4":12} []uint8 
	} 
} 

2、序列化map为json,采用json.Marshal()方法

package main 
 
import ( 
	"encoding/json" 
	"fmt" 
) 
 
type Test6Map1 map [string] interface{} 
 
func main()  { 
	var t6_1 = Test6Map1{"test1":"test111","test2":"test222","test3":"test333"} 
 
 
 
	d,e := json.Marshal(t6_1) 
	if e != nil { 
		fmt.Println(e) 
	}else { 
		fmt.Println(string(d)) 
	} 
 
 
	var t6_2 = make(map[int]interface{},10) 
	t6_2[1] = "11111111" 
	t6_2[2] = 22222222 
	t6_2[3] = 'b' 
	t6_2[4] = true 
	t6_2[5] = 3.14 
	t6_2[6] = false 
 
	d,e = json.Marshal(t6_2) 
	if e != nil { 
		fmt.Println(e) 
	}else { 
		fmt.Println(string(d)) 
	} 
 
	//{"1":"11111111","2":22222222,"3":98,"4":true,"5":3.14,"6":false} 
 
} 

3、反序列化,采用json.Unmarshal(b,&i)方法

package main 
 
import ( 
	"encoding/json" 
	"fmt" 
) 
 
type Test7Person1 struct { 
	Name1 string 
	Name2 int 
	Name3 byte 
	Name4 bool 
	Name5 float32 
	//Name6 bool 
 
} 
 
func main()  { 
 
	//反序列化到结构体,只会反序列化结构体中有的字段,如果json中有字段1,而在结构体中没有字段1,则反序列化就不会有字段1 
	var b = []byte(`{"Name1":"11111111","Name2":22,"Name3":98,"Name4":true,"Name5":3.14,"Name6":false}`) 
	//var b = []byte(`{"Name1":"test1","Name2":"test2","Name3":"test3"}`) 
	var t7 Test7Person1 
 
	e := json.Unmarshal(b,&t7) 
 
	if e != nil { 
		fmt.Println(e) 
	}else { 
		fmt.Println(t7) 
		//{11111111 22 98 true 3.14} 
	} 
 
 
	//反序列化到接口 
	var i interface{} 
 
	e1 := json.Unmarshal(b,&i) 
 
	if e1 != nil { 
		fmt.Println(e) 
	}else { 
		fmt.Println(i) 
		//map[Name1:11111111 Name2:22 Name3:98 Name4:true Name5:3.14 Name6:false] 
	} 
 
} 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20921.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论