为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森卡 2021-07-08 16:11:39
我有结构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 的简单方法。
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

这是通过添加,string到您的标签来处理的,如下所示:


type tySurvey struct {

   Id   int64  `json:"id,string,omitempty"`

   Name string `json:"name,omitempty"`

}

这可以在Marshal的文档中找到。


请注意,您不能通过指定来解码空字符串,omitempty因为它仅在编码时使用。


查看完整回答
反对 回复 2021-07-19
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

用 json.Number


type tySurvey struct {

    Id     json.Number      `json:"id,omitempty"`

    Name   string           `json:"name,omitempty"`

}


查看完整回答
反对 回复 2021-07-19
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

您还可以为 int 或 int64 创建类型别名并创建自定义 json unmarshaler 示例代码:

// StringInt create a type alias for type int

type StringInt int


// UnmarshalJSON create a custom unmarshal for the StringInt

/// this helps us check the type of our value before unmarshalling it


func (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)


}



查看完整回答
反对 回复 2021-07-19
  • 3 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信