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

Posted

技术标签:

【中文标题】无法将字符串解组为 int64 类型的 Go 值【英文标题】:Cannot unmarshal string into Go value of type int64 【发布时间】:2014-02-04 18:26:49 【问题描述】:

我有结构

type tySurvey struct 
    Id     int64            `json:"id,omitempty"`
    Name   string           `json:"name,omitempty"`

我确实 json.Marshalhtml 页面中写入 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 的简单方法。

【问题讨论】:

有没有办法知道是哪个字段导致了问题? 【参考方案1】:

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

Reference

// 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)





【讨论】:

【参考方案2】:

使用json.Number

type tySurvey struct 
    Id     json.Number      `json:"id,omitempty"`
    Name   string           `json:"name,omitempty"`

【讨论】:

这是正确答案。接受的答案不起作用【参考方案3】:

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

type tySurvey struct 
   Id   int64  `json:"id,string,omitempty"`
   Name string `json:"name,omitempty"`

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

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

【讨论】:

如果id 没有以整数形式出现,这将起作用。否则,你会得到一个错误“invalid use of ,string struct tag...”

以上是关于无法将字符串解组为 int64 类型的 Go 值的主要内容,如果未能解决你的问题,请参考以下文章

恐慌:json:无法将数组解组为 main.Structure 类型的 Go 值

json 错误,无法将对象解组为 Go 值

部分 JSON 在 Go 中解组为地图

将 json 数组解组为 go struct(数组在 JSON 字符串的中间

部分JSON解组到Go中的地图中

如何使用 jaxb 将 xml 字符串解组为 java 对象