Golang JSON 详解


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, 据说他有着非常高的性能

json-iterator

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() &#123;
    t := new(Test)
    t.Content = "<p>test</p>"
    bf := bytes.NewBuffer([]byte&#123;&#125;)
    jsonEncoder := json.NewEncoder(bf)
    jsonEncoder.SetEscapeHTML(false)
    jsonEncoder.Encode(t)
    fmt.Println(bf.String())
&#125;

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 &#123;
    MarshalText() (text []byte, err error)
&#125;

// 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 &#123;
    UnmarshalText(text []byte) error
&#125;

Author: winjeg
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source winjeg !
  TOC