猿问

无法将字符串解组为 int64 类型的 Go 值

我有结构


type tySurvey struct {

    Id     int64            `json:"id,omitempty"`

    Name   string           `json:"name,omitempty"`

}

我确实json.Marshal在 HTML 页面中编写了 JSON 字节。jQuery 修改name对象中的字段并使用 jQueries 对对象进行编码JSON.stringify,jQuery 将字符串发布到 Go 处理程序。


id 字段编码为字符串。


发送:{"id":1}接收:{"id":"1"}


问题是json.Unmarshal无法解组该 JSON,因为id它不再是整数。


json: cannot unmarshal string into Go value of type int64

处理此类数据的最佳方法是什么?我不想手动转换每个字段。我希望编写紧凑、无错误的代码。


行情还不错。JavaScript 不适用于 int64。


我想学习使用 int64 值中的字符串值解组 json 的简单方法。


慕森卡
浏览 323回答 3
3回答

猛跑小猪

这是通过添加,string到您的标签来处理的,如下所示:type tySurvey struct {   Id   int64  `json:"id,string,omitempty"`   Name string `json:"name,omitempty"`}这可以在Marshal的文档中找到。请注意,您不能通过指定来解码空字符串,omitempty因为它仅在编码时使用。

慕虎7371278

用 json.Numbertype tySurvey struct {    Id     json.Number      `json:"id,omitempty"`    Name   string           `json:"name,omitempty"`}

守着星空守着你

您还可以为 int 或 int64 创建类型别名并创建自定义 json unmarshaler 示例代码:// StringInt create a type alias for type inttype StringInt int// UnmarshalJSON create a custom unmarshal for the StringInt/// this helps us check the type of our value before unmarshalling itfunc (st *StringInt) UnmarshalJSON(b []byte) error {    //convert the bytes into an interface    //this will help us check the type of our value    //if it is a string that can be converted into a int we convert it    ///otherwise we return an error    var item interface{}    if err := json.Unmarshal(b, &item); err != nil {        return err    }    switch v := item.(type) {    case int:        *st = StringInt(v)    case float64:        *st = StringInt(int(v))    case string:        ///here convert the string into        ///an integer        i, err := strconv.Atoi(v)        if err != nil {            ///the string might not be of integer type            ///so return an error            return err        }        *st = StringInt(i)    }    return nil}func main() {    type Item struct {        Name   string    `json:"name"`        ItemId StringInt `json:"item_id"`    }    jsonData := []byte(`{"name":"item 1","item_id":"30"}`)    var item Item    err := json.Unmarshal(jsonData, &item)    if err != nil {        log.Fatal(err)    }    fmt.Printf("%+v\n", item)}
随时随地看视频慕课网APP

相关分类

Go
我要回答