将Go图转换成json

我试图将我的Go地图转换为带有encoding/json Marshal的jsonstring,但是却导致了一个空string。

这是我的代码:

 package main import ( "encoding/json" "fmt" ) type Foo struct { Number int `json:"number"` Title string `json:"title"` } func main() { datas := make(map[int]Foo) for i := 0; i < 10; i++ { datas[i] = Foo{Number: 1, Title: "test"} } jsonString, _ := json.Marshal(datas) fmt.Println(datas) fmt.Println(jsonString) } 

我的输出是:

 map[9:{1 test} 2:{1 test} 7:{1 test} 3:{1 test} 4:{1 test} 5:{1 test} 6:{1 test} 8:{1 test} 0:{1 test} 1:{1 test}] [] 

我真的不知道我错在哪里。 感谢您的帮助。

如果你发现错误,你会看到这个:

 jsonString, err := json.Marshal(datas) fmt.Println(err) // [] json: unsupported type: map[int]main.Foo 

事情是你不能在JSON中使用整数作为键; 这是被禁止的。 相反,您可以事先将这些值转换为string,例如使用strconv.Itoa

看到这个职位的更多细节: https : //stackoverflow.com/a/24284721/2679935

它实际上告诉你什么是错的,但是你忽略了它,因为你没有检查从json.Marshal返回的错误。

json: unsupported type: map[int]main.Foo

JSON规范不支持除了对象键的string以外的任何东西,而javascript不会对它挑剔,它仍然是非法的。

你有两个select:

1使用map[string]Foo并将索引转换为string(例如,使用fmt.Sprint):

 datas := make(map[string]Foo, N) for i := 0; i < 10; i++ { datas[fmt.Sprint(i)] = Foo{Number: 1, Title: "test"} } j, err := json.Marshal(datas) fmt.Println(string(j), err) 

2只需使用切片(JavaScript数组):

 datas2 := make([]Foo, N) for i := 0; i < 10; i++ { datas2[i] = Foo{Number: 1, Title: "test"} } j, err = json.Marshal(datas2) fmt.Println(string(j), err) 

操场