当有错误的 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)
}
默认情况下,引用 docs、json.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 属性 alamat
和 umur
将被忽略,因为它们在结构 A
和 [=15= 中不匹配] 和 age
设置为它们的默认类型。
我有结构 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)
}
默认情况下,引用 docs、json.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 属性 alamat
和 umur
将被忽略,因为它们在结构 A
和 [=15= 中不匹配] 和 age
设置为它们的默认类型。