我在javascript代码下面运行。
return $.ajax({
url: "/loyalty/api/rule/new",
type: "POST",
contentType: "application/json",
data: JSON.stringify({'rule':$('form').serializeObject(),'ruleId':ruleID(),'programId':parseInt(proID)})
});
我使用以下代码对其进行解码。
decoder := json.NewDecoder(r.Body)
var rules models.NewRule
err := decoder.Decode(&rules)
但随后它会给出以下错误消息。
level=error msg="json: cannot unmarshal string into Go value of type models.NewRule" api="/rule/new" code=400 tenantid=7 username=admin
你能帮我解决这个问题吗?
我的新规则结构
type NewRule struct {
TenantID int `db:"tenantId"json:"tenantId"`
ProgramID commons.NullInt64 `db:"programId"json:"programId"`
RuleID commons.NullInt64 `db:"ruleId"json:"ruleId"`
Rule commons.NullString `db:"rule"json:"rule"`
}
func (p NewRule) String() string {
b, _ := json.Marshal(p)
return string(b)
}
我认为你误解了serializeObject
在JavaScript中的工作方式。从精细手册:
.serializeObject — 将选定的表单序列化为 JavaScript 对象
$('form#contact').serializeObject(); //=> {user: {email: "jsmith@example.com", pets: ["cat", "dog"]}}
.serializeJSON — 将选定的表单序列化为 JSON
$('form#contact').serializeJSON(); //=> '{"user":{"email":"jsmith@example.com","pets":["cat","dog"]}}'
serializeObject
给你一个对象,这样:
{'rule': $('form').serializeObject(), 'ruleId': ruleID(), 'programId': parseInt(proID)}
会给你这样的JavaScript:
{
rule: { /* some JavaScript object goes here */ },
ruleId: 6,
programId: 11
}
因此,JSON 中的 "rule"
键将有一个完整的对象(而不是字符串(作为其值,并且decoder.Decode
正确地拒绝将对象解压缩为字符串。
如果您希望rule
在解压缩时是一串 JSON 编码的数据,那么您希望 JSON 包含在 JSON 中:
data: JSON.stringify({
'rule': $('form').serializeJSON(), // <---- serialize the form to JSON, not an object
'ruleId': ruleID(),
'programId': parseInt(proID)
})
然后你正在做的事情应该有效,你最终会在 Go 中得到 JSON 编码的数据rules.Rule
。