根据文档,a
[]byte将被编码为base64字符串。
“数组和切片值编码为JSON数组, 除了[] byte编码为base64编码的字符串 ,而nil slice编码为空JSON对象。”
因此,我认为您可能需要通过实现自己的方法来使struct实现Marshaler接口,
MarshalJSON该方法将使您的JSON数组编码更为理想
[]uint8。
举个例子:
import "fmt"import "encoding/json"import "strings"type Test struct { Name string Array []uint8}func (t *Test) MarshalJSON() ([]byte, error) { var array string if t.Array == nil { array = "null" } else { array = strings.Join(strings.Fields(fmt.Sprintf("%d", t.Array)), ",") } jsonResult := fmt.Sprintf(`{"Name":%q,"Array":%s}`, t.Name, array) return []byte(jsonResult), nil}func main() { t := &Test{"Go", []uint8{'h', 'e', 'l', 'l', 'o'}} m, err := json.Marshal(t) if err != nil { fmt.Println(err) } fmt.Printf("%s", m) // {"Name":"Go","Array":[104,101,108,108,111]}}http://play.golang.org/p/Tip59Z9gqs
也许更好的主意是创建一个具有
[]uint8其基础类型的新类型,将该类型设为a
Marshaler,并在您的结构中使用该类型。
import "fmt"import "encoding/json"import "strings"type JSonableSlice []uint8func (u JSONableSlice) MarshalJSON() ([]byte, error) { var result string if u == nil { result = "null" } else { result = strings.Join(strings.Fields(fmt.Sprintf("%d", u)), ",") } return []byte(result), nil}type Test struct { Name string Array JSONableSlice}func main() { t := &Test{"Go", []uint8{'h', 'e', 'l', 'l', 'o'}} m, err := json.Marshal(t) if err != nil { fmt.Println(err) } fmt.Printf("%s", m) // {"Name":"Go","Array":[104,101,108,108,111]}}http://play.golang.org/p/6aURXw8P5d



