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]
	}

}
原文地址:https://www.cnblogs.com/bainianminguo/p/10903099.html