рдореИрдВ JSON рд╕реЗ YAML рдореЗрдВ рдХреЛрдб рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ UnmarshalYAML рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ UnmarshalJSON рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ UnmarshalJSON рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ рдФрд░ рдЖрдЧреЗ json.Unmarshal рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдХреБрдЫ рдЯрдЪ-рдЕрдк/рд╕рддреНрдпрд╛рдкрди рдХрд░рддрд╛ рд╣реИред
рдирд┐рд╖реНрдкрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдВрддрд╣реАрди рд░рд┐рдХрд░реНрд╕рди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рдЗрд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд▓рд╛рдЗрд╡ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ: http://play.golang.org/p/St33ZkWvTN
рдиреЛрдЯ foo.ok unmarshaling рдХреЗ рджреМрд░рд╛рди рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдореВрд▓ рд╕рдВрджреЗрд╢ рдореЗрдВ рдирд╣реАрдВ рдерд╛ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЕрдм, рдЬрдм рд╡рд╛рдИрдПрдПрдордПрд▓ рдХреЗ рд╕рдордХрдХреНрд╖ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд░рд┐рдХрд░реНрд╕рди рд▓реВрдк рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рдИрдПрдПрдордПрд▓ рдЕрдирдорд░реНрд╢рд▓рд░ рдЬреЗрдПрд╕рдУрдПрди рд╕реЗ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ред
рдпрд╣рд╛рдБ рдПрдХ рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ:
package main
import (
"encoding/json"
"fmt"
"os"
yaml "gopkg.in/yaml.v2"
)
type Foo struct {
Bar string
ok bool
}
type fooJSON *Foo
func (f *Foo) UnmarshalJSON(data []byte) error {
fmt.Printf("unmarshal JSON\n")
if err := json.Unmarshal(data, fooJSON(f)); err != nil {
return err
}
f.ok = true
return nil
}
type fooYAML *Foo
var n = 0
func (f *Foo) UnmarshalYAML(unmarshal func(interface{}) error) error {
n += 1
fmt.Printf("unmarshal YAML\n")
if n > 1 {
os.Exit(1)
}
if err := unmarshal(fooYAML(f)); err != nil {
return err
}
f.ok = true
return nil
}
func main() {
var foo1, foo2 Foo
err := json.Unmarshal([]byte(`{"bar": "baz"}`), &foo1)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", foo1)
err = yaml.Unmarshal([]byte(`{"bar": "baz"}`), &foo2)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", foo2)
}
рдФрд░ рдЗрд╕рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:
unmarshal JSON
{Bar:baz ok:true}
unmarshal YAML
unmarshal YAML
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо yaml рдкреИрдХреЗрдЬ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ json рдкреИрдХреЗрдЬ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореМрдЬреВрджрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред
рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ 4 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХреА рдереА, рдЗрд╕рд▓рд┐рдП рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди .. рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ @rojer рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рдо рдорд┐рд▓рд╛?
рдореЗрд░реЗ рдкрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдКрдкрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
@mykter рдореБрдЭреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рд╕рдордп рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ред рдХреНрд╖рдорд╛ рдорд╛рдВрдЧрдирд╛ред
рд╣рд╛рдп @mykter рдореИрдВ рдЗрд╕реА рдореБрджреНрджреЗ рдкрд░ рдЖрдпрд╛ рдерд╛ рдФрд░ рд░рд┐рд╕реАрд╡рд░ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдкрд░ рдХрд╛рд╕реНрдЯ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рдирдП рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:
func (f *Foo) UnmarshalYAML(unmarshal func(interface{}) error) error {
// Do extra actions
type fooYAML Foo
fy := (*fooYAML)(f)
if err := unmarshal(fy); err != nil {
return err
}
return nil
}
рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рд╛рдп @mykter рдореИрдВ рдЗрд╕реА рдореБрджреНрджреЗ рдкрд░ рдЖрдпрд╛ рдерд╛ рдФрд░ рд░рд┐рд╕реАрд╡рд░ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдкрд░ рдХрд╛рд╕реНрдЯ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рдирдП рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:
рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛!