编组切片结果为字符串
Marshaling slice results in character string
我正在尝试 json 编码一片 uint8
值,但这样做会产生一个字符串。例如,这个:
d := []uint8{1,2,3,4}
data, err := json.Marshal(d)
fmt.Println(string(data), err)
结果:
"AQIDBA==" <nil>
我期待 [1,2,3,4]
,但我得到的却是这个奇怪的字符串。 Here 是一个上面有这段代码的游乐场。
那是因为您使用 uint8
类型作为您的号码,而 uint8
是 byte
(Spec: Numeric types) 的别名。默认情况下,字节数组和切片使用 Base64 编码进行编码,这就是您所看到的("AQIDBA=="
是字节 [1, 2, 3, 4]
的 Base64 编码文本)。
引自 json.Marhsal()
文档:
Array and slice values encode as JSON arrays, except that []byte encodes as a base64-encoded string, and a nil slice encodes as the null JSON object.
例如,将您的号码类型更改为 uint
或 int
,然后您将看到您期望的结果。
例如(Go Playground):
type MyStruct struct {
Data []uint
}
d := new(MyStruct)
d.Data = []uint{1, 2, 3, 4}
data, err := json.Marshal(d)
fmt.Println(string(data), err)
输出:
{"Data":[1,2,3,4]} <nil>
我正在尝试 json 编码一片 uint8
值,但这样做会产生一个字符串。例如,这个:
d := []uint8{1,2,3,4}
data, err := json.Marshal(d)
fmt.Println(string(data), err)
结果:
"AQIDBA==" <nil>
我期待 [1,2,3,4]
,但我得到的却是这个奇怪的字符串。 Here 是一个上面有这段代码的游乐场。
那是因为您使用 uint8
类型作为您的号码,而 uint8
是 byte
(Spec: Numeric types) 的别名。默认情况下,字节数组和切片使用 Base64 编码进行编码,这就是您所看到的("AQIDBA=="
是字节 [1, 2, 3, 4]
的 Base64 编码文本)。
引自 json.Marhsal()
文档:
Array and slice values encode as JSON arrays, except that []byte encodes as a base64-encoded string, and a nil slice encodes as the null JSON object.
例如,将您的号码类型更改为 uint
或 int
,然后您将看到您期望的结果。
例如(Go Playground):
type MyStruct struct {
Data []uint
}
d := new(MyStruct)
d.Data = []uint{1, 2, 3, 4}
data, err := json.Marshal(d)
fmt.Println(string(data), err)
输出:
{"Data":[1,2,3,4]} <nil>