Можно ли привязать к объекту карты пользовательский тип структуры?
Мой вопрос, как связать (автоматическое связывание?) пользовательский тип структуры в объекте карты (переменная)?
это мой пользовательский тип структуры
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)
результат печати,
'map[]' //nil...
это моя полная ссылка на вопрос ( GOLANG> Как связать данные ajax json с пользовательским типом структуры?)
Помогите мне, пожалуйста.
пс. спасибо за ответ мне. Мне понравился ответ. НО это тоже не работает.
Первый,
- 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...
почему бы не связать пользовательский тип структуры в объекте карты?
мне так жаль я решаю этот вопрос. проблема в том, что мой собственный тип структуры go имеет другой пользовательский тип структуры.
как это.
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...
Я очень рад вашим ответам и вниманию.
2 ответа
В вашем коде Go нет проблем. Почему эхо .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) {
......
});
Возможно, вам следует удалить тег структуры "form", когда вы используете "application/json" для отправки данных, тег "form" не используется.
Программа работает хорошо, когда я просто добавляю тег "json", и если я добавляю тег "form", echo использует "form" и выдает ошибку.
Надеюсь, это поможет вам.