具有错误的json输入结构时,Unmarshall应该返回错误

时间:2019-02-22 07:02:28

标签: json go struct marshalling unmarshalling

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

}

1 个答案:

答案 0 :(得分:3)

默认情况下,引用docsjson.Unmarshal(data []byte, v interface{})不能像您想象的那样工作:

  

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

因此,alamat中的JSON属性umurvalB被忽略,因为它们在结构Aname和{{1}中不匹配}设置为其默认类型。