FieldName
:当解析 json 的时候,使用这个名字举例来说吧:
// 解析的时候忽略该字段。默认情况下会解析这个字段,因为它是大写字母开头的
Field int `json:"-"`
// 解析(encode/decode) 的时候,使用
`other_name`,而不是 `Field`Field int `json:"other_name"`
// 解析的时候使用 `other_name`,如果struct 中这个值为空,就忽略它
Field int `json:"other_name,omitempty"`
由于原文篇幅较长,这里只转载一部分,可去原文查看全部内容/2016/12/19/golang-json-guide
自己写几个小demo测试一下:
package main
import (
"encoding/json"
"fmt"
)
type peerInfo struct {
HTTPPort int
TCPPort int
versiong string
}
func main() {
pi := peerInfo{80, 3306, "0.0.1"}
js, err := (pi)
if err != nil {
(err)
}
(string(js))
}
输出结果:
{"HTTPPort":80,"TCPPort":3306}
首字母为小写时,为private字段,不会转换。
struct中添加tag:
package main
import (
"encoding/json"
"fmt"
)
type peerInfo struct {
HTTPPort int `json:"http_port"`
TCPPort int `json:"tcp_port"`
versiong string
}
func main() {
pi := peerInfo{80, 3306, "0.0.1"}
js, err := (pi)
if err != nil {
(err)
}
(string(js))
}
输出结果:
{"http_port":80,"tcp_port":3306}
json转换成go对象:
package main
import (
"encoding/json"
"fmt"
)
type peerInfo struct {
HTTPPort int `json:"http_port"`
TCPPort int `json:"tcp_port"`
versiong string
}
func main() {
var v peerInfo
data := []byte(`{"http_port":80,"tcp_port":3306}`)
err := (data, &v)
if err != nil {
(err)
}
("%+v\n", v)
}
输出结果:
{HTTPPort:80 TCPPort:3306 versiong:}
去除tag:
package main
import (
"encoding/json"
"fmt"
)
type peerInfo struct {
HTTPPort int
TCPPort int
versiong string
}
func main() {
var v peerInfo
data := []byte(`{"http_port":80,"tcp_port":3306}`)
err := (data, &v)
if err != nil {
(err)
}
("%+v\n", v)
}
得到结果:
{HTTPPort:0 TCPPort:0 versiong:}
无法解析到对象中。
最后,再贴一下原文中关于的几点: