Как заставить go кодировать `[8] byte` как hex при маршалинге в json - PullRequest
0 голосов
/ 24 октября 2018

По умолчанию байтовые фрагменты маршалируются как строки Base64, а байтовые массивы конвертируются следующим образом:

func main() {
    type Foo struct {
        ByteSlice []byte
        ByteArray [6]byte
    }

    foo := Foo {
        ByteSlice: []byte{0, 0, 0, 1, 2, 3},
        ByteArray: [6]byte{0, 0, 0, 1, 2, 3},
    }
    text, _ := json.Marshal(foo)
    fmt.Printf("%s", text)
}

Вывод:

{"ByteSlice":"AAAAAQID","ByteArray":[0,0,0,1,2,3]}

Есть ли способ использовать преобразование шестнадцатеричной строки длябайтовые фрагменты?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете настроить сериализацию JSON, если определите пользовательский тип.Я заменил []byte например:

Вывод:

{"ByteSlice":"000000010203","ByteArray":[0,0,0,1,2,3]}

Код:

package main

import (
    "encoding/hex"
    "encoding/json"
    "fmt"
)

type MyByteSlice []byte

func (m MyByteSlice) MarshalJSON() ([]byte, error) {
    return json.Marshal(hex.EncodeToString(m))
}

func main() {
    type Foo struct {
        ByteSlice MyByteSlice
        ByteArray [6]byte
    }

    foo := Foo {
        ByteSlice: []byte{0, 0, 0, 1, 2, 3},
        ByteArray: [6]byte{0, 0, 0, 1, 2, 3},
    }

    text, _ := json.Marshal(foo)
    fmt.Printf("%s\n", text)
}
0 голосов
/ 24 октября 2018

Есть ли способ использовать преобразование шестнадцатеричной строки для байтовых срезов?

Нет, нет.

Вы должны кодировать его самостоятельно.Либо в новую структуру со строковым полем, либо написав собственный метод UnmarshalJSON, как описано в пакете документа json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...