我的结构:
type User struct {
FirstName string `json:"firstname, omitempty" validate:"required"`
LastName string `json:"lastname, omitempty" validate:"required"`
NumberofDays int `json:"numberofdays, string" validate:"min=0,max=100"`
}
NumberofDays的值从服务器传递为字符串,但我想检查它是否在范围内并存储为int。
例如:user := &User{"Michael","Msk","3"}
我得到的'无法将字符串解组为int'类型的Go值。
我不确定如何对int进行类型转换并进行验证
答案 0 :(得分:2)
删除struct标记中逗号后面的空格,例如json:"numberofdays, string"
应为json:"numberofdays,string"
。对于空格,json
包会忽略string
部分,因此会显示您收到的错误消息。没有空间,错误消失,行为就像预期的那样。
演示比较两者:https://play.golang.org/p/AUImnw_PIS
json
包结构标记的文档:https://golang.org/pkg/encoding/json/#Marshal
答案 1 :(得分:0)
json包为这些情况定义了自定义类型json.Number
。
答案 2 :(得分:-1)
您可以使用自定义类型来解组字符串 使用任何一组解析规则的整数值 您希望此映射使用:
package main
import (
"encoding/json"
"fmt"
"strconv"
)
type User struct {
FirstName string `json:"firstname,omitempty" validate:"required"`
LastName string `json:"lastname,omitempty" validate:"required"`
NumberofDays StrInt `json:"numberofdays" validate:"min=0,max=100"`
}
type StrInt int
func (si *StrInt) UnmarshalJSON(b []byte) error {
var s string
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
n, err := strconv.ParseInt(s, 10, 0)
if err != nil {
return err
}
*si = StrInt(n)
return nil
}
const data = `{
"FirstName": "John",
"LastName": "Doe",
"NumberOfDays": "42"
}`
func main() {
var u User
err := json.Unmarshal([]byte(data), &u)
if err != nil {
panic(err)
}
fmt.Println(u)
}
这个想法如下:
int
的自定义类型,但允许在其上定义自定义方法。encoding/json.Unmarshaler
方法,使该类型满足UnmarshalJSON()
接口。string
- 和
然后解析它作为一个整数。这种方法可能看起来很奇怪,但是如果你想到它的话 再多一点,没有单身"真正的"整数的字符串表示形式: 代表有不同的基础和不同的惯例 甚至在特定的基础上整数。
在您的解组方法中,您实现了文本表示的策略 你的整数。