为了账号安全,请及时绑定邮箱和手机立即绑定

从消息包转换到消息包

从消息包转换到消息包

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 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信