json 序列化与 tag

124 阅读1分钟

1.序列化与反序列化

1.序列化-------把go语言中的结构体变量转换成为json格式的字符串
2.反序列化-----把json格式的字符串转换成为go语言中的结构体变量

package main
import (
	"encoding/json"
	"fmt"
)
type person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
func main() {
	p1 := person{
		Name: "周琳",
		Age:  18,
	}
	b, _ := json.Marshal(p1) //转化后,b里面是转化的结果
	fmt.Println(string(b))
        
	//反序列化
	str := `{"name":"zhou","age":18}`
	var p2 person
	_ = json.Unmarshal([]byte(str), &p2) //传指针是为了在内部修改p2的值
	fmt.Printf("%#v", p2)

}
//{"name":"周琳","age":18}
//main.person{Name:"zhou", Age:18}

2.结构体里的变量不加tag能不能正常转成json里的字段?

  • 如果变量首字母小写,则为private。无论如何不能转,因为取不到反射信息
  • 如果变量首字母大写,则为public
    • 不加tag,可以正常转为json里的字段,json内字段名跟结构体内字段原名一致
    • 加了tag,从structjson的时候,json的字段名就是tag里的字段名,原字段名失效
package main  
import (  
    "encoding/json"  
    "fmt"  
)  
type J struct {  
    a string             //小写无tag  
    b string `json:"B"`  //小写+tag  
    C string             //大写无tag  
    D string `json:"DD"` //大写+tag  
}  
func main() {  
    j := J {  
      a: "1",  
      b: "2",  
      C: "3",  
      D: "4",  
    }  
    fmt.Printf("转为json前j结构体的内容 = %+v\n", j)  
    jsonInfo, _ := json.Marshal(j)  
    fmt.Printf("转为json后的内容 = %+v\n"string(jsonInfo))  
}
//转为json前j结构体的内容 = {a:1 b:2 C:3 D:4}  
//转为json后的内容 = {"C":"3","DD":"4"}

可以发现 a,b 序列化失败
C 没有 tag 就是用的变量名字
D 有 tag 就使用的 tag 名字

部分转载自[mp.weixin.qq.com/s/bZlKV_BWS…]