概述
在使用json的时候,常见的一个错误,就是结构体在Marshal后输出为空。
案例
首先定义一个point结构体:
type point struct {
x float32
y float32
}
然后创建一个point实例,并使用标准的json.Marshal函数把该实例编码成一个JSON输出:
p := point{3.0, 2.5}
b, err := json.Marshal(p) //①
if err != nil {
return err
}
fmt.Println(string(b)) //②
① Marshal p
② b是一个[]byte变量,我们需要把它转换成可读的字符创。
不幸的的,上面的输出是空:
{}
可能原因
1.是因为结构体中没有设置JSON的标签吗?
type point struct {
x float32 `json:"x"` //①
y float32 `json:"y"` //②
}
2.是因为该结构体不是公有的吗?
type Point struct {
x float32
y float32
}
3.是因为该结构体内部的字段不是公有的吗?
type point struct {
X float32
Y float32
}
分别测试一下:
1和2还是输出空 {}
只有3输出了
{"x": 3, "Y": 2.5}
因此,要进行marshaled/unmarshaled,结构体的字段必须被导出(定义为公有)。
拓展
在Marshal时,如果我们想忽略一些字段该怎么办呢?
有两种方法:
1、不导出这些字段,即让字段名的首字母小写;
2、使用JSON标签。即使用 “-” ;
type Foo struct {
A string
b string //方法1
C string `json:"-"` //方法2
}