在Go中解组时检查json值

7rhvnn

我正在使用通常提供json字符串值的API,但是有时它们会提供数字。例如,99%的时间是这样的:

{
    "Description": "Doorknob",
    "Amount": "3.25"
}

但是出于某种原因,有时是这样的:

{
    "Description": "Lightbulb",
    "Amount": 4.70
}

这是我正在使用的结构,在99%的时间内都可以使用:

type Cart struct {
    Description string `json:"Description"`
    Amount      string `json:"Amount"`
}

但是当他们提供数字量时,它将中断。解组结构时键入检查的最佳方法是什么?

游乐场:https : //play.golang.org/p/S_gp2sQC5-A

icza

对于一般情况,您可以interface{}按照Burak Serdar的答案中所述使用

特别是对于数字,有json.Number一种类型:它可以接受JSON数字和JSON字符串,并且如果以Number.Int64()给出字符串,则可以“自动”解析该数字Number.Float64()不需要自定义封送员。

type Cart struct {
    Description string      `json:"Description"`
    Amount      json.Number `json:"Amount"`
}

测试它:

var (
    cart1 = []byte(`{
    "Description": "Doorknob",
    "Amount": "3.25"
}`)

    cart2 = []byte(`{
    "Description": "Lightbulb",
    "Amount": 4.70
}`)
)

func main() {
    var c1, c2 Cart
    if err := json.Unmarshal(cart1, &c1); err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", c1)
    if err := json.Unmarshal(cart2, &c2); err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", c2)
}

输出(在Go Playground上尝试):

{Description:Doorknob Amount:3.25}
{Description:Lightbulb Amount:4.70}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章