如何将JSON文档中的字符串值解组为int类型的变量?

时间:2017-11-09 16:09:55

标签: json go unmarshalling

我的结构:

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进行类型转换并进行验证

3 个答案:

答案 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)
}

Playground

这个想法如下:

  1. 拥有一个大多数int的自定义类型,但允许在其上定义自定义方法。
  2. 通过在指向该类型的指针上实现encoding/json.Unmarshaler方法,使该类型满足UnmarshalJSON()接口。
  3. 在该方法中,首先将值解组为其本机类型 - string - 和 然后解析它作为一个整数。
  4. 这种方法可能看起来很奇怪,但是如果你想到它的话 再多一点,没有单身"真正的"整数的字符串表示形式: 代表有不同的基础和不同的惯例 甚至在特定的基础上整数。

    在您的解组方法中,您实现了文本表示的策略 你的整数。