简介
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]
}
}
浙公网安备 33010602011771号