Unmarshall должен возвращать ошибку при неправильной структуре ввода json - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть структуры 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 голосов
/ 22 февраля 2019

Ссылаясь на docs , json.Unmarshal(data []byte, v interface{}), по умолчанию не работает так, как вы предполагаете:

По умолчанию ключи объекта, которые не имеют соответствующихПоле struct игнорируется (см. альтернативу в разделе Decoder.DisallowUnknownFields).

Итак, свойства JSON alamat и umur в вашем valB игнорируются, так как они не совпадают в struct A, а name и age установлены в их типпо умолчанию.

...