我的[]uint8成员有一个结构,我正在用编写它json.Marshal。麻烦的是,它将s解释uint8为chars,并且它输出字符串而不是数字数组。
[]uint8
json.Marshal
uint8
char
如果它是[]int,我可以使它工作,但是如果可以避免的话,我不想分配和复制这些项目。我可以吗?
[]int
根据文档,a []byte将被编码为Base64字符串。
[]byte
“数组和切片值编码为JSON数组, 除了[] byte编码为base64编码的字符串 ,而nil slice编码为空JSON对象。”
因此,我认为您可能需要通过实现自己的方法来使struct实现Marshaler接口,MarshalJSON该方法将使您的JSON数组编码更为理想[]uint8。
MarshalJSON
举个例子:
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,并在您的结构中使用该类型。
Marshaler
import "fmt" import "encoding/json" import "strings" type JSONableSlice []uint8 func (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