加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang -- 序列化 msgpack & json

发布时间:2020-12-16 18:57:14 所属栏目:大数据 来源:网络整理
导读:下面总结一下go的序列化,通信中常用的格式:msgpack和json msgpack 安装: go get go get github.com/vmihailenco/msgpack go install github.com/vmihailenco/msgpack api:http://godoc.org/github.com/vmihailenco/msgpack func ExampleEncode() { b,err :=

下面总结一下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 %#vn",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 %#vn",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 %#vn",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 %#vn",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":"322222","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 [{豫322222 A1111 2 VA3K.10001} {311112 豫A1112 2 VA3K.10002}]}
**结构体首字母要大写,并且和json串要对应
②把json串解析到interface
func main(){
	json_str := `{"result":0,"cars":[{"id":"豫322222","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:豫322222 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}`)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读