【Golang】Marshal和Unmarshal


JSON Marshal:数据编码转化成Json字符串


    package main
    import (
    	"fmt"
    	"encoding/json"
    )
    
    type Stu struct{
    	Name string `json:"name"`
    	Age  int
    	High bool
    	sex  string    //可导出成员(变量首字母大写),都可以转化为json,所以sex不可导出,无法转成json
    	Class *Class `json:"class"`
    }
    
    type Class struct{
    	Name string
    	Grade int
    }
    
    func main(){
    	stu := Stu{
    		Name:"张三",
    		Age :20,
    		sex :"man",
    		High:true,
    		
    	}
    	
        //指针变量
    	cla := new(Class)
    	cla.Name = "89班"
    	cla.Grade = 5
    	stu.Class=cla
    	
    	jsonStu, err := json.Marshal(stu)
    	if err!=nil{
    		fmt.Println("生成json字符串错误")
    	}
    	
    	fmt.Println("string(jsonStu) :",string(jsonStu))
    }
  1. 如果变量打上了json标签,如Name旁边的的json:"name",那么转换成的json key就用该标签"name",否则,取变量名作为key,如Str结构体内的Age、Heigh。
  2. bool类型也可以转化为json的vaule值,bool-->bool。Channel,complex(复数)以及函数不能被编码为json字符串。循环的数据结构也不行,会导致marshal陷入死循环
  3. 指针变量,编码时自动转换成它所指向的值,如cla变量
  4. json编码成为字符串后就是纯粹的字符串

使用interface{}空接口来接受各种类型数据变量

type Stu struct{
	Name interface{} `json:"name"`
	Age  interface{} 
	High interface{}
	sex  interface{}
	Class interface{} `json:"class"`
}

type Class struct{
	Name string
	Grade int
}


//示范

//方式一 只声明,不分配内存
var stus1 [] *StuRead

//方式二 分配初始值为0的内存
stus2 := make([] *StuRead,0)

//new()只能实例化一个对象,[]StuRead是切片,不是对象

//方式一、方式二创建的切片,都能追加数据
//方式二最好分配0长度,append时会自动追加增长,如果指定初始长度则不会自动增长长度(cap),导致数据丢失【知识点:append时 如果cap不够,那么cap就会翻倍】
stus1 := append(stus1,stu1,stu2)
stus2 := append(stus2,stu2,stu2)

//成功编码
json1,_ := json.Marshal(stus1)
json2._ := json.Marshal(stus2)

解码时定义对应的切片即可