登录
首页 >  Golang >  Go问答

Unmarshal 应该在 JSON 输入结构出错时返回错误

来源:stackoverflow

时间:2024-03-04 18:45:27 140浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《Unmarshal 应该在 JSON 输入结构出错时返回错误》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我有结构 a 和 b。当 json 字符串 a 被解组为结构 a 时,它是有效的,但是如果 json 字符串 a 被解组为结构 b,它仍然是成功的(这不应该)。

有什么方法可以检测到错误的 json 输入已被错误地转换为错误的结构类型吗?

请看下面的代码:播放

package main

import (
    "encoding/json"
    "fmt"
)

type A struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type B struct {
    Alamat string `json:"alamat"`
    Umur   int    `json:"umur"`
}

func main() {
    var structA A
    var structAA A

    valA := "{\"name\":\"budi\",\"age\":10}"
    valB := "{\"alamat\":\"jakarta\",\"umur\":120}"

    //correct case
    err := json.Unmarshal([]byte(valA), &structA)
    if err != nil {
        fmt.Println("fail unmarshal")
    }

    fmt.Println(structA.Name)
    fmt.Println(structA.Age)

    //unmarshalled successfully but with wrong json
    err = json.Unmarshal([]byte(valB), &structAA)
    if err != nil {
        fmt.Println("fail unmarshal")
    }

    fmt.Println(structAA.Name)
    fmt.Println(structAA.Age)

}

解决方案


默认情况下,引用 docsjson.Unmarshal(data []byte, v interface{}) 不会按照您想象的方式工作:

默认情况下,没有相应结构字段的对象键将被忽略(请参阅 Decoder.DisallowUnknownFields 了解替代方案)。

因此,valB 中的 JSON 属性 alamatumur 将被忽略,因为它们在结构 A 中不匹配,并且 nameage 设置为其默认类型。

以上就是《Unmarshal 应该在 JSON 输入结构出错时返回错误》的详细内容,更多关于的资料请关注golang学习网公众号!

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