当 json 输入结构错误时,Unmarshall 应该返回错误

我有结构 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)


}


千巷猫影
浏览 112回答 1
1回答

潇潇雨雨

默认情况下,参考文档json.Unmarshal(data []byte, v interface{}), 并不像您想象的那样工作:默认情况下,没有相应结构字段的对象键将被忽略(参见 Decoder.DisallowUnknownFields 的替代方法)。因此,JSON 属性alamat和umur您的属性valB将被忽略,因为它们在结构中不匹配A并且被设置为它们的默认类型。nameage
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go