golang中json与struct中tag

时间:2025-03-08 07:44:03
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:}

无法解析到对象中。

最后,再贴一下原文中关于的几点: