Yaml: рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдЬреЛ рдЦреБрдж рдЕрдирдорд╛рд░реНрд╢рд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЬреВрди 2015  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: go-yaml/yaml

рдореИрдВ 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

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдп @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
}

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛!

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо 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
}

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕