是否可以绑定到自定义结构类型的地图对象?
Is it possible to bind to map object of custom struct type?
我的问题是,
如何在地图对象(变量)中绑定(自动绑定?)自定义结构类型?
这是我的自定义结构类型
type Tetris struct {
... ...
NowBlock map[string]int `form:"nowBlock" json:"nowBlock"`
... ...
}
这是我的ajax代码
$.ajax({
type : "POST"
, url : "/game/tetris/api/control"
, data : {
"keyCode" : keyCode
, "ctxWidth" : ctxWidth
, "ctxHeight" : ctxHeight
, "nowBlock" : {"O":0}
} // also, i did JSON.stringify, but did not binding..
, dataType : "json"
, contentType : "application/json"
}).done(function(data){
... ...
});
然后,不绑定'NowBlock'
tetris := new(Tetris)
if err := c.Bind(tetris); err != nil {
c.Logger().Error(err)
}
fmt.Println(tetris.NowBlock)
println 结果是,
'map[]' //nil...
这是我的完整问题link(GOLANG > How to bind ajax json data to custom struct type?)
请帮助我。
ps。谢谢你回答我。
我确实喜欢这个答案。
但是,它也不起作用。
首先,
- No 'contentType : "application/json"'
- don't use JSON.stringify
then, in go side,
- fmt.println(tetris.KeyCode) // OK
- fmt.println(tetris.NowBlock) // NOT OK.. 'map[]'
第二,
- Use 'contentType : "application/json"'
- Use JSON.stringify
then, in go side,
- fmt.println(tetris.KeyCode) // NOT OK.. '' (nil)
- fmt.println(tetris.NowBlock) // NOT OK.. 'map[]'
第三,
i remove the custom struct type Tetris NowBlock object's `form:nowBlock` literal,
but is does not working too...
为什么不在地图对象中绑定自定义结构类型?
我很抱歉。我解决了这个问题。
问题是我的自定义结构类型有另一个自定义结构类型。
像这样。
type Tetris struct {
Common Common
NowBlock map[string]int `json:"nowBlock"`
}
type Common struct {
CtxWidth int `json:"ctxWidth"`
CtxHeight int `json:"ctxHeight"`
KeyCode int `form:"keyCode" json:"keyCode"`
}
在这种情况下,我做了
$.ajax({
type : "POST"
, url : "/game/tetris/api/control"
, data : {
"keyCode" : keyCode
, "ctxWidth" : ctxWidth
, "ctxHeight" : ctxHeight
, "nowBlock" : {"O":0}
} // also, i did JSON.stringify, but did not binding..
, dataType : "json"
, contentType : "application/json"
}).done(function(data){
... ...
});
但是,这是错误的!
正确的是,
$.ajax({
type : "POST"
, url : "/game/tetris/api/control"
, data : JSON.stringify({
"Common" : {
"keyCode" : keyCode
, "ctxWidth" : ctxWidth
, "ctxHeight" : ctxHeight
}
, "nowBlock" : {"O":0}
})
, dataType : "json"
, contentType : "application/json"
}).done(function(data){
... ...
在json数据中,'Common'结构类型的数据必须有"Common"'Key:value'映射...
很高兴得到您的回答和关注。
也许你应该删除结构标签'form',当你使用'application/json'发送数据时,'form'标签未被使用。
当我只添加 'json' 标签时程序运行良好,如果我添加 'form' 标签,echo 使用 'form' 并得到一个错误。
希望对您有所帮助。
你的go代码没有问题。为什么 echo .Bind()
无法检索从 AJAX 发送的有效载荷是因为有效载荷不是 JSON 格式。
在$.ajax
你需要将数据JSON.stringify()
转换成JSON字符串格式。
JSON.stringify({
"keyCode" : keyCode
, "ctxWidth" : ctxWidth
, "ctxHeight" : ctxHeight
, "nowBlock" : {"O":0}
})
将contentType
设置为application/json
不会自动将有效负载转换为JSON字符串。这就是为什么 JSON.stringy()
仍然是必需的。
完整更改:
var payload = JSON.stringify({
"keyCode": keyCode,
"ctxWidth": ctxWidth,
"ctxHeight": ctxHeight,
"nowBlock": {
"O": 0
}
})
$.ajax({
type: "POST",
url: "/game/tetris/api/control",
data: payload,
dataType: "json",
contentType: "application/json"
}).done(function(data) {
......
});
我的问题是, 如何在地图对象(变量)中绑定(自动绑定?)自定义结构类型?
这是我的自定义结构类型
type Tetris struct {
... ...
NowBlock map[string]int `form:"nowBlock" json:"nowBlock"`
... ...
}
这是我的ajax代码
$.ajax({
type : "POST"
, url : "/game/tetris/api/control"
, data : {
"keyCode" : keyCode
, "ctxWidth" : ctxWidth
, "ctxHeight" : ctxHeight
, "nowBlock" : {"O":0}
} // also, i did JSON.stringify, but did not binding..
, dataType : "json"
, contentType : "application/json"
}).done(function(data){
... ...
});
然后,不绑定'NowBlock'
tetris := new(Tetris)
if err := c.Bind(tetris); err != nil {
c.Logger().Error(err)
}
fmt.Println(tetris.NowBlock)
println 结果是,
'map[]' //nil...
这是我的完整问题link(GOLANG > How to bind ajax json data to custom struct type?)
请帮助我。
ps。谢谢你回答我。
我确实喜欢这个答案。
但是,它也不起作用。
首先,
- No 'contentType : "application/json"'
- don't use JSON.stringify
then, in go side,
- fmt.println(tetris.KeyCode) // OK
- fmt.println(tetris.NowBlock) // NOT OK.. 'map[]'
第二,
- Use 'contentType : "application/json"'
- Use JSON.stringify
then, in go side,
- fmt.println(tetris.KeyCode) // NOT OK.. '' (nil)
- fmt.println(tetris.NowBlock) // NOT OK.. 'map[]'
第三,
i remove the custom struct type Tetris NowBlock object's `form:nowBlock` literal,
but is does not working too...
为什么不在地图对象中绑定自定义结构类型?
我很抱歉。我解决了这个问题。
问题是我的自定义结构类型有另一个自定义结构类型。
像这样。
type Tetris struct {
Common Common
NowBlock map[string]int `json:"nowBlock"`
}
type Common struct {
CtxWidth int `json:"ctxWidth"`
CtxHeight int `json:"ctxHeight"`
KeyCode int `form:"keyCode" json:"keyCode"`
}
在这种情况下,我做了
$.ajax({
type : "POST"
, url : "/game/tetris/api/control"
, data : {
"keyCode" : keyCode
, "ctxWidth" : ctxWidth
, "ctxHeight" : ctxHeight
, "nowBlock" : {"O":0}
} // also, i did JSON.stringify, but did not binding..
, dataType : "json"
, contentType : "application/json"
}).done(function(data){
... ...
});
但是,这是错误的! 正确的是,
$.ajax({
type : "POST"
, url : "/game/tetris/api/control"
, data : JSON.stringify({
"Common" : {
"keyCode" : keyCode
, "ctxWidth" : ctxWidth
, "ctxHeight" : ctxHeight
}
, "nowBlock" : {"O":0}
})
, dataType : "json"
, contentType : "application/json"
}).done(function(data){
... ...
在json数据中,'Common'结构类型的数据必须有"Common"'Key:value'映射...
很高兴得到您的回答和关注。
也许你应该删除结构标签'form',当你使用'application/json'发送数据时,'form'标签未被使用。
当我只添加 'json' 标签时程序运行良好,如果我添加 'form' 标签,echo 使用 'form' 并得到一个错误。
希望对您有所帮助。
你的go代码没有问题。为什么 echo .Bind()
无法检索从 AJAX 发送的有效载荷是因为有效载荷不是 JSON 格式。
在$.ajax
你需要将数据JSON.stringify()
转换成JSON字符串格式。
JSON.stringify({
"keyCode" : keyCode
, "ctxWidth" : ctxWidth
, "ctxHeight" : ctxHeight
, "nowBlock" : {"O":0}
})
将contentType
设置为application/json
不会自动将有效负载转换为JSON字符串。这就是为什么 JSON.stringy()
仍然是必需的。
完整更改:
var payload = JSON.stringify({
"keyCode": keyCode,
"ctxWidth": ctxWidth,
"ctxHeight": ctxHeight,
"nowBlock": {
"O": 0
}
})
$.ajax({
type: "POST",
url: "/game/tetris/api/control",
data: payload,
dataType: "json",
contentType: "application/json"
}).done(function(data) {
......
});