今天测试程序出现json把字符串转成结构体,结构体对应的属性都为空的bug。
出现问题的原因:猜测原因可能是由于需要调用结构体中的属性,但是我的结构体开头字母是小写的,也就是是private权限,可能作用域只有在结构体内和该结构体的方法中,在外部无法访问。
解决方案:如果想使用json.Marshal方法来转结构体,那就要把结构体中的属性名的首字母大写(public),所以我把结构体的首字母都大写了。
例子
type User struct {
id int
name string
age int
class string
}
// 官网例子
type ColorGroup struct {
ID int
Name string
Colors []string
}
func (this *UserController) Get() {
fmt.Println(this.Ctx.Input.Param(":user"))
a, _ := this.GetInt(":user")
fmt.Println("hello")
fmt.Println(a)
time.Sleep(time.Duration(a) * time.Second)
//this.Ctx.WriteString("hello World")
user := User{
id: 1,
name: "wang",
age: 22,
class: "class1",
}
body, err := json.Marshal(user)
if err != nil {
fmt.Println("Error: ", err)
}
fmt.Println("user: ",string(body))
group := ColorGroup{
ID: 1,
Name: "Reds",
Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
b, err := json.Marshal(group)
if err != nil {
fmt.Println("error:", err)
}
fmt.Println("color: ",string(b))
this.Ctx.WriteString(string(body))
}
输出
{}
{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
上面的user结构体序列化之后为 空 应该修改为:
type User struct {
Id int // 首字母大写
Name string
Age int
Class string
}
go struct 空值的json直接不展示
那么需要给struct定义tag:
//omitempty
type Node struct {
Name string `json:name,omitempty` // 名称
Age int `json:age` // 年龄
}
当结构体有omitempty的时候,如果name为空,那么最终生成的json中没有name字段。
omitempty,tag里面加上omitempy,可以在序列化的时候忽略0值或者空值