Different behaviors between this library and standard encoding/json when unmarshal yaml to a struct embedded with other structs
zhyee opened this issue · 1 comments
zhyee commented
Take a look at the code below:
package main
import (
"encoding/json"
"fmt"
"log"
"gopkg.in/yaml.v3"
)
type Base struct {
Name string `json:"name" yaml:"name"`
}
type Foo struct {
Base
FooName string `json:"foo_name" yaml:"foo_name"`
}
type Bar struct {
Base
BarName string `json:"bar_name" yaml:"bar_name"`
}
var jsonTxt = `{
"name": "base",
"foo_name": "foobar"
}`
var yamlTxt = `
name: base
bar_name: foobar
`
func main() {
var (
foo Foo
bar Bar
)
if err := json.Unmarshal([]byte(jsonTxt), &foo); err != nil {
log.Fatal(err)
}
if err := yaml.Unmarshal([]byte(yamlTxt), &bar); err != nil {
log.Fatal(err)
}
fmt.Printf("foo.Name in json: %q, foo.FooName in json: %q\n", foo.Name, foo.FooName)
fmt.Printf("bar.Name in yaml: %q, bar.BarName in yaml; %q\n", bar.Name, bar.BarName)
}
the output:
foo.Name in json: "base", foo.FooName in json: "foobar"
bar.Name in yaml: "", bar.BarName in yaml; "foobar"
"encoding/json" can set field value of embeded struct,but yaml not.
bogushevich commented
Hi. You can use yaml:",inline"
for embedded structures.
https://pkg.go.dev/gopkg.in/yaml.v3#example-Unmarshal-Embedded