我具有结构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)
}
答案 0 :(得分:3)
默认情况下,引用docs,json.Unmarshal(data []byte, v interface{})
不能像您想象的那样工作:
默认情况下,没有相应结构字段的对象键将被忽略(有关替代方法,请参见Decoder.DisallowUnknownFields)。
因此,alamat
中的JSON属性umur
和valB
被忽略,因为它们在结构A
和name
和{{1}中不匹配}设置为其默认类型。