我有结构
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的简单方法。
答案 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 示例代码:
// 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”就足够了。 祝你好运!