Конвертировать из и в пакет сообщений - PullRequest
0 голосов
/ 29 ноября 2018

Итак, я пытаюсь получить строковое представление сообщения JSON на Голанге.Я просто хочу получить JSON в кодировке пакета сообщений, изменить некоторые значения и отправить его обратно.

Я не нашел простого способа сделать это.В большинстве случаев Я не могу заранее знать, какова структура JSON (кроме структуры JSON), поэтому я хочу получить двоичное сообщение.Расшифруйте его как JSON, напечатайте как строку для стандартного вывода, измените содержимое, снова конвертируйте его в MessagePack и отправьте обратно.

Я просматривал эти два пакета, но я нене знаю, как правильно использовать их для такой простой задачи, как:

Так что я получу что-то вродеэто:

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

Текущий код Python, который я пытаюсь перенести на Golang:

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 ]

0 голосов
/ 29 ноября 2018

Используя библиотеку кодеков и предполагая, что {"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.

0 голосов
/ 29 ноября 2018

Лучший способ - сначала декодировать его, вносить изменения через структуры 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...