我在golang中创建一个API,它只是以json格式显示地图中的所有数据。 端点:/ keys
type UserController struct{}
// NewUserController function
func NewUserController() *UserController {
return &UserController{}
}
// Data struct
type Data struct {
Datakey int `json:"key"`
Datavalue string `json:"value"`
}
var datamap = make(map[int]string)
func (uc UserController) getallkeys(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
type Users []Data
var uj Users
for k, v := range datamap {
uj = Users{
Data{
Datakey: k,
Datavalue: v,
},
}
}
result, _ := json.Marshal(uj)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(200)
fmt.Fprintf(w, "%s", result)
}
例如: 响应应该是
[
{
"key":somekey,
"value":"somevalue"
},
{
"key":somekey,
"value":"somevalue"
}
]
我不清楚如何实现这一点。上面的代码只显示地图中的最后一个数据。这是不正确的,但我不知道如何继续。如果有人可以帮助我,那就太好了。
感谢。
答案 0 :(得分:1)
至少有两个不同的问题。
首先,JSON Map不能有“int”键。这是JSON规范的一部分。要么将其更改为字符串,要么必须为地图实现MarshalJSON和UnmarshalJSON接口,即类型
type MyMap map[int]string
Google golang UnmarshalJSON time.Duration
了解了一些基本示例。另外,针对地图和您的特定密钥类型。
其次,对于切片类型
type Users []Data
添加元素需要附加
uj := make(Users,0)
for k, v := range datamap {
d := Data{k,v}
uj = append(uj, d)
}
当然,编组切片会生成无密钥的JSON映射 - 可能不是您想要的。