封送至JSON时,如何强制将[[8] byte]编码为十六进制

时间:2018-10-24 11:34:08

标签: json go

默认情况下,字节字节片被编组为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 :(得分:2)

如果定义自定义类型,则可以自定义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)
}

答案 1 :(得分:0)

  

有没有一种方法可以对字节片使用十六进制字符串转换?

不,没有。

您必须自己编码。要么进入带有字符串字段的新结构,要么通过编写自己的UnmarshalJSON方法(如程序包json的文档中所述)。