golang -- 序列化 msgpack & json

下面总结一下go的序列化,通信中常用的格式:msgpack和json

msgpack
安装:
go get go get github.com/vmihailenco/msgpack
go installgithub.com/vmihailenco/msgpack
api:http://godoc.org/github.com/vmihailenco/msgpack

func ExampleEncode() {
    b,err := msgpack.Marshal(true)
    fmt.Printf("%v %#v\n",err,b)
    // Output: <nil> []byte{0xc3}
}

func ExampleDecode() {
    var out bool
    err := msgpack.Unmarshal([]byte{0xc3},&out)
    fmt.Println(err,out)
    // Output: <nil> true
}

func ExampleMapStringInterface() {
    in := map[string]interface{}{"foo": uint32(123456789),"hello": "world"}
    b,err := msgpack.Marshal(in)
    _ = err

    var out map[string]interface{}
    err = msgpack.Unmarshal(b,&out)
    fmt.Printf("%v %#v\n",out)
    // Output: <nil> map[string]interface {}{"foo":0xfecaefbe,"hello":"world"}
}

func ExampleRecursiveMapStringInterface() {
    buf := &bytes.Buffer{}

    enc := msgpack.NewEncoder(buf)
    in := map[string]interface{}{"foo": map[string]interface{}{"hello": "world"}}
    _ = enc.Encode(in)

    dec := msgpack.NewDecoder(buf)
    dec.DecodeMapFunc = func(d *msgpack.Decoder) (interface{},error) {
        n,err := d.DecodeMapLen()
        if err != nil {
            return nil,err
        }

        m := make(map[string]interface{},n)
        for i := 0; i < n; i++ {
            mk,err := d.DecodeString()
            if err != nil {
                return nil,err
            }

            mv,err := d.DecodeInterface()
            if err != nil {
                return nil,err
            }

            m[mk] = mv
        }
        return m,nil
    }
    out,err := dec.DecodeInterface()
    fmt.Printf("%v %#v\n",out)
    // Output: <nil> map[string]interface {}{"foo":map[string]interface {}{"hello":"world"}}
}

在网络流中:

buf := &bytes.Buffer{}
buf.Write([]byte{164,97,98,99,100})
buf.Write([]byte{164,100})
dec := msgpack.NewDecoder(buf)
for {
    out,err := dec.DecodeBytes()
    if err != nil {
        break
    }
    fmt.Printf("%v %#v\n",string(out))
}



json
-->loads:
①把json串解析到结构体

//-----------------json loads----------------
// 把json串解析到结构体
package main

import (
    "fmt"
    "encoding/json"
)

func main(){
    type carinfo struct {
        Id string
        License string
        Color int
        Device string // "<设备类型>.<设备id>"
    }
    
    type carlist struct {
        Result int
        Message string
        Cars []carinfo
    }
    
    var msg carlist
    json_str := `{"result":0,"message":"ok","cars":[{"id":"311111","license":"豫A1111","color":2,"device":"VA3K.10001"},{"id":"311112","license":"豫A1112","device":"VA3K.10002"}]}`
    err := json.Unmarshal([]byte(json_str),&msg)
    if err != nil {
        fmt.Println("json loads err:",err)
    }
    fmt.Println(msg)
}

# {0  ok [{豫311111 A1111 2 VA3K.10001} {311112 豫A1112 2 VA3K.10002}]}
**结构体首字母要大写,并且和json串要对应
②把json串解析到interface
func main(){
	json_str := `{"result":0,"cars":[{"id":"豫311111","license":"A1111","device":"VA3K.10002"}]}`
	var msg map[string]interface{}
	err := json.Unmarshal([]byte(json_str),&msg)
	if err == nil{
		fmt.Println(msg)
	}
}
# map[result:0 message:ok cars:[map[id:豫311111 license:A1111 color:2 device:VA3K.10001] map[id:311112 license:豫A1112 color:2 device:VA3K.10002]]]
-->dumps:

直接
b := []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)
这样就行了,就可以用Unmarshal解析了
②使用Marshal
type Message struct {
    Name string
    Body string
    Time int64
}
m := Message{"Alice","Hello",1294706395881547000}
b,err := json.Marshal(m)
# b --> []byte(`{"Name":"Alice","Time":1294706395881547000}`)

相关文章

什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他...
1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下...
1、概述 1.1&#160;Protocol buffers定义 Protocol buffe...
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat(...
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指...
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=1...