当有错误的 json 输入结构时,Unmarshall 应该 return 错误

Unmarshall should return error when having wrong json input structure

我有结构 A 和 B。当 JSON 字符串 A 解组为结构 A 时它是有效的,但是如果 JSON 字符串 A 解组为结构 B 它仍然成功(不应该)。

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

请看下面的代码:play

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{}) 并不像您想象的那样工作:

By default, object keys which don't have a corresponding struct field are ignored (see Decoder.DisallowUnknownFields for an alternative).

因此,您的 valB 中的 JSON 属性 alamatumur 将被忽略,因为它们在结构 A 和 [=15= 中不匹配] 和 age 设置为它们的默认类型。