GOLANG JSON 详解
JSON 简介
json
是JavaScript Object Notation 的简称, 它是一种数据格式定义语言, 使用起来非常简单,层级结构也非常明确,学习成本几乎为0, 两分钟即可明白它的格式和含义,并上上手写自己的一段json, 下面是个json的实例
{
"data":1,
mems:[
{
"name":"Tom",
"age":6,
"avatar": null
}
]
}
JSON 库
对于golang 而言, json解析也是sdk自带的一个功能, 而且它还定义了json的一些规范,位置在 encoding/json
下面。
另外还有一个值得一提的json库是 github.com/json-iterator/go
, 据说他有着非常高的性能
API 定义
// 序列化
func Marshal(v interface{}) ([]byte, error)
// 序列化并且加缩进
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
// 反序列化
func Unmarshal(data []byte, v interface{}) error
使用示例
type Test struct {
Content string
}
func testJson() {
var a A
// 序列化
d, err := json.Marshal(a)
// 反序列化
json.Unmarshal(d, &a)
}
JSON TAGS
type A struct {
Name string `json:"name,omitempty"` // name, 可为空空则忽略
Age int `json:"age"`
Num uint64 `json:"num,string"` // 把num在序列化的时候序列化成string
}
注意事项
json html 注意事项
html的encode的时候往往会有问题, 因为默认的json的marshal 方法是忽略这点的, html标签中的 >
, <
, &
会被golang变掉, 如果想保持原样请用如下方式
func testJson() {
t := new(Test)
t.Content = "<p>test</p>"
bf := bytes.NewBuffer([]byte{})
jsonEncoder := json.NewEncoder(bf)
jsonEncoder.SetEscapeHTML(false)
jsonEncoder.Encode(t)
fmt.Println(bf.String())
}
JSON 自定义marshal
在 encoding 包下有个文件叫 encoding.go
里面定义了很多接口,在反序列化的时候会被调用,如果你想像java那样通过设置 getter 和setter来改变默认的行为, 你只需要把被处理的对象实现这些接口就行了, 例如我们常见的 logrus.Level
便实现了这一接口, 可以使得 “info”字符串可以被反序列化成 uint32
// TextMarshaler is the interface implemented by an object that can
// marshal itself into a textual form.
//
// MarshalText encodes the receiver into UTF-8-encoded text and returns the result.
type TextMarshaler interface {
MarshalText() (text []byte, err error)
}
// TextUnmarshaler is the interface implemented by an object that can
// unmarshal a textual representation of itself.
//
// UnmarshalText must be able to decode the form generated by MarshalText.
// UnmarshalText must copy the text if it wishes to retain the text
// after returning.
type TextUnmarshaler interface {
UnmarshalText(text []byte) error
}