不能将字符串解组成struct类型的Go值

问题描述 投票:0回答:1

我在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 

你能帮我解决这个问题吗?

我的NewRule结构

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)
}
javascript ajax go
1个回答
2
投票

我认为你误解了serializeObject在JavaScript中是如何工作的。来自fine manual

.serializeObject - 将选定的表单序列化为JavaScript对象

$('form#contact').serializeObject();
//=> {user: {email: "[email protected]", pets: ["cat", "dog"]}}

.serializeJSON - 将选定的表单序列化为JSON

$('form#contact').serializeJSON();
//=> '{"user":{"email":"[email protected]","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中的rules.Rule中使用JSON编码数据。

© www.soinside.com 2019 - 2024. All rights reserved.