登录
首页 >  Golang >  Go问答

Go JSON 解码错误行为是如何工作的?

来源:stackoverflow

时间:2024-03-17 13:51:27 485浏览 收藏

在 Go 语言中,JSON 解码错误行为如下: 当遇到解码错误时,Go 标准库中的 JSON 解码器将返回一个错误,但会继续处理其他字段。这意味着即使某个字段解码失败,解码器也会尝试解码其余字段,但不能保证这些字段能正确解码。这种行为有助于在出现错误时仍然获得尽可能多的数据,但需要注意的是,错误字段之后的数据可能不可靠。

问题内容

我试图了解 go 中遇到错误时 json 解码和解组的行为。特别是,在以下结构中,title 字段的格式与返回的 json 和提供的错误提供的格式不同。尽管出现错误,该行为是否会继续处理其他字段,或者是否会停止处理其他字段?我没有发现任何关于标准库中如何处理此问题的提及。

type response struct {
    title struct {
        text          string `json:"text"`
        accessibility struct {
            label      string `json:"label"`
            identifier string `json:"identifier"`
        } `json:"accessibility"`
    } `json:"title,omitempty"`
    type    string `json:"type"`
}
{
    "title": "test",
    "type": "type"
}

解决方案


快速测试揭示了这一点:

func main() {
    var r response
    if err := json.unmarshal([]byte(src), &r); err != nil {
        fmt.println(err)
    }
    fmt.printf("%+v", r)
}

const src = `{
    "title": "test",
    "type": "type"
}

结果(在Go Playground上尝试一下):

json: cannot unmarshal string into Go struct field Response.title of type struct { Text string "json:\"text\""; Accessibility struct { Label string "json:\"label\""; Identifier string "json:\"identifier\"" } "json:\"accessibility\"" }
{Title:{Text: Accessibility:{Label: Identifier:}} Type:type}

当随后的 type 字段正确解组时,会返回非 nil 错误。

一般情况下:会返回错误,而解组会在没有任何保证的情况下继续进行。

这记录在 json.Unmarshal()

如果 json 值不适合给定的目标类型,或者 json 数字溢出目标类型,unmarshal 会跳过该字段并尽可能完成解组。如果没有遇到更严重的错误,unmarshal 将返回一个 unmarshaltypeerror,描述最早的此类错误。无论如何,不能保证有问题的字段之后的所有剩余字段将被解组到目标对象中。

以上就是《Go JSON 解码错误行为是如何工作的?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>