golang json处理

解析JSON

  • 结构体中的小写字段非导出,不会被encode或decode
  • 如果输入是字符串流,使用json.Decoder
    • 例如从一个HTTP response读取
  • 如果数据已经在内存中,使用json.Unmarshal

Unmarshal

 func Unmarshal(data []byte, v interface{}) error
 // 使用
 err := json.Unmarshal([]byte(s), &m)
  • v是一个结构体指针或map指针
  • 能够被赋值的字段必须是可导出字段(即首字母大写)
    • 当你接收到一个很大的JSON数据结构而你却只想获取其中的部分数据的时候,你只需将你想要的数据对应的字段名大写
  • 如果不知道JSON数据的结构,可以先解析到空接口中,然后利用断言解析

Decoder

// NewDecoder returns a new decoder that reads from r.
func NewDecoder(r io.Reader) *Decoder
// Decode reads JSON-encoded value from input and stores it in the value pointed to by v.
func (dec *Decoder) Decode(v interface{}) error

// 使用方式
const jsonStream = `
        {"Name": "Ed", "Text": "Knock knock."}
        {"Name": "Sam", "Text": "Who's there?"}
        {"Name": "Ed", "Text": "Go fmt."}
        {"Name": "Sam", "Text": "Go fmt who?"}
        {"Name": "Ed", "Text": "Go fmt yourself!"}
    `
type Message struct {
    Name, Text string
}
//初始化一个Decoder对象
//func NewDecoder(r io.Reader) *Decoder
dec := json.NewDecoder(strings.NewReader(jsonStream))

for {
    var m Message
//创建的decoder对象的Decide方法可以将内容解析到接口v中
//func (dec *Decoder) Decode(v interface{}) error
//读取到末尾和读取错误
    if err := dec.Decode(&m); err == io.EOF {
        break
    } else if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s: %s\n", m.Name, m.Text)
}

生成JSON

  • JSON 对象只支持字符串类型的 key
    • 要编码一个map,该map的key会被自动转换为string类型

Marshal

func Marshal(v interface{}) ([]byte, error)
// 使用
bytes, err := json.Marshal(m)
  • MarshalIndent不仅把结构体转换为json字符串,还按照json格式缩进

Encoder

// NewEncoder returns a new encoder that writes to w.
func NewEncoder(w io.Writer) *Encoder
//Encode writes the JSON encoding of v to the stream.
func (enc *Encoder) Encode(v interface{}) error

// 使用方法
// 结构体转为[]byte
m := struct {
		Name, Text string
	}{
		Name: "Ed", Text: "Knock knock.",
	}

var s bytes.Buffer
err := json.NewEncoder(&s).Encode(m)
str := s.Bytes()
	

json-iterator

  • 滴滴开源的json解析器,速度比原生的快很多
// 兼容标准方式的写法
import jsoniter "github.com/json-iterator/go"

var json = jsoniter.ConfigCompatibleWithStandardLibrary

func f() {
	json.Marshal(...)
	json.Unarshal(...,...)
}

Struct Tag

  • 字段tag
    • 字段的tag是"-",那么这个字段不会输出到JSON
    • tag中如果带有",omitempty"选项,那么如果该字段值为空,就不会输出到JSON串中
    • 如果字段类型是bool, string, int, int64等,而tag中带有",string"选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串
type Server struct {
	// ID 不会导出到JSON中
	ID int `json:"-"`
	ServerName  string `json:"serverName"`
	// code在json中的类型会变成string
	code int `json:"code,string"`
	// 如果 ServerIP 为空,则不输出到JSON串中
	ServerIP   string `json:"serverIP,omitempty"`
}

参考

  • Golang处理json(一)— 编码
  • Golang处理json(二)— 解码

你可能感兴趣的:(Golang)