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

时间:2014-01-16 01:27:01

标签: jquery json go marshalling unmarshalling

我有结构

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

我在HTML页面中json.Marshal写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的简单方法。

4 个答案:

答案 0 :(得分:50)

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

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

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

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

答案 1 :(得分:2)

使用json.Number

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

答案 2 :(得分: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)

}



答案 3 :(得分:0)

已发送:{“ id”:1}已收到:{“ id”:“ 1”}

让我们解决此问题。

您的情况是-> http post'localhost:8080 / users / blahblah'id = 1

将其更改为->  http post'localhost:8080 / users / blahblah'id:= 1

不需要做“ json:id,string”的事情,只需“ json:id”就足够了。 祝你好运!