亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從消息包轉換到消息包

從消息包轉換到消息包

Go
慕田峪9158850 2023-05-15 10:16:38
所以我試圖在 Golang 中獲取 JSON 消息的字符串表示形式。我只想接收消息包編碼的 JSON,修改一些值并將其發回。我還沒有找到一種簡單的方法來做到這一點。大多數時候,我無法提前知道 JSON 的結構是什么(除了具有 JSON 結構),所以我想做的就是接收二進制消息。將其解碼為 JSON,將其作為字符串打印到標準輸出,修改內容,再次將其轉換為 MessagePack 并發回。我一直在看這兩個包,但我不知道如何正確使用它們來完成這樣的簡單任務:https://godoc.org/github.com/vmihailenco/msgpackhttps://godoc.org/github.com/ugorji/go/codec所以我會收到這樣的東西:DF 00 00 00 01 A7 6D 65 73 73 61 67 65 A3 48 69 21我想打印這個:{"message": "Hi!"}修改“嗨!”:{"message": "Hello Sir!"}將其作為消息包發送:DF 00 00 00 01 A7 6D 65 73 73 61 67 65 AA 48 65 6C 6C 6F 20 53 69 72 21我正在嘗試移植到 Golang 的當前 Python 代碼:def decode_msgpack(jsonData):    packedStuff = 0    for key in jsonData.keys():        if type(jsonData[key]) is bytes:            packedStuff += 1            try:                jsonData[key] = umsgpack.unpackb(jsonData[key])            except umsgpack.InvalidStringException:                try:                    jsonData[key] = umsgpack.unpackb(jsonData[key], allow_invalid_utf8=True)                except umsgpack.InsufficientDataException:                    print("[!] InsufficientDataException")                    jsonData[key] = base64.b64encode(jsonData[key]).decode('utf-8')                else:                    jsonData[key] = base64.b64encode(jsonData[key]).decode('utf-8')    if packedStuff > 0:        return decode_msgpack(jsonData)    else:        return jsonData
查看完整描述

2 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

使用編解碼器庫并假設它{"message": "Hi"}是一張地圖,代碼看起來像這樣。


package main


import (

        "fmt"


        "github.com/ugorji/go/codec"

)


func main() {

        var data []byte

        original := map[string]string{"message": "Hi!"}

        enc := codec.NewEncoderBytes(&data, new(codec.MsgpackHandle))

        if err := enc.Encode(&original); err != nil {

                panic(err)

        }

        fmt.Printf("Encoded: ")

        for _, b := range data {

                fmt.Printf("%X ", b)

        }

        fmt.Printf("\n")

        decoded := make(map[string]string)

        dec := codec.NewDecoderBytes(data, new(codec.MsgpackHandle))

        if err := dec.Decode(&decoded); err != nil {

                panic(err)

        }

        fmt.Printf("Decoded: %v\n", decoded)

        decoded["message"] = "Hello Sir!"

        /* reinitialize the encoder */

        enc = codec.NewEncoderBytes(&data, new(codec.MsgpackHandle))

        if err := enc.Encode(&decoded); err != nil {

                panic(err)

        }

        fmt.Printf("Encoded: ")

        for _, b := range data {

                fmt.Printf("%X ", b)

        }

        fmt.Printf("\n")

}

也就是說,如果您獲取的{"message": "Hi"}是 JSON 字符串,則可以使用編解碼器將 JSON 解碼為地圖,更新地圖,然后將其重新編碼為 msgpack。


查看完整回答
反對 回復 2023-05-15
?
呼如林

TA貢獻1798條經驗 獲得超3個贊

最好的方法是先解碼它,通過 Go 結構進行更改,然后重新編碼。


data := []byte(`{"message": "Hi!"}`)

var p map[string]interface{}


// Decode into Struct

if err := json.Unmarshal(data, &p); err != nil {

    // TODO: handle err

}


// Modify contents

p["message"] = "Hello Sir!"


// Encode from struct

newData, err := json.Marshal(p)

if err != nil {

    // TODO: Handle err

}


fmt.Println(string(newData))


查看完整回答
反對 回復 2023-05-15
  • 2 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號