Yaml: рдлрд╝реАрдЪрд░ рдЕрдиреБрд░реЛрдз: json.RawMessage рд╕рдордХрдХреНрд╖

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

sth рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред http://golang.org/pkg/encoding/json/#RawMessage рдХреЗ рд╕рдорд╛рди

рдореИрдВ http://github.com/michaelsauter/crane рдореЗрдВ go-yaml рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ JSON/YAML рдХреЛ рдЕрдирдорд░реНрд╢рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

enhancement thinking

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

рдХреНрдпрд╛ рдпрд╣ UnmarshalYAML рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП unmarshal рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдмрд╛рдж рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

type RawMessage struct {
    unmarshal func(interface{}) error
}

func (msg *RawMessage) UnmarshalYAML(unmarshal func(interface{}) error) error {
    msg.unmarshal = unmarshal
    return nil
}

func (msg *RawMessage) Unmarshal(v interace{}) error {
    return msg.unmarshal(v)
}

рдлрд┐рд░ рдЖрдк рдмрд╛рдж рдореЗрдВ RawMessage.Unmarshal(v) рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

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

рдореИрдВ рдЗрд╕реЗ +1 рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛!

рд╣рд╛рдБ, рдореБрдЭреЗ рд╡рд╣ рднреА рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рджреЗрд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдХреЛрдИ рдЬреНрдЮрд╛рдд рдХрд╛рдордХрд╛рдЬ рд╣реИ? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ Unmarshaller рдЗрдВрдЯрд░рдлрд╝реЗрд╕ 1 рдХреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

yaml.RawMessage . рдХреЗ рд▓рд┐рдП +1

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

yaml.MapSlice рд╕рдВрд░рдЪрдирд╛ json.RawMessage рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ

yaml.RawMessage . рдХреЗ рд▓рд┐рдП +1

Yaml.RawMessage рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ JSON рдХреЗ рд╡рд┐рдкрд░реАрдд, YAML рд╕рдВрджрд░реНрдн-рдирд┐рд░реНрднрд░ рд╣реИред рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рдХрд╛рд░рдг, рдЖрд╕рдкрд╛рд╕ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдХрдЪреНрдЪреЗ YAML рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдареАрдХ рд╕реЗ рдПрдиреНрдХреЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ +1 рдорддрджрд╛рддрд╛ рдХреГрдкрдпрд╛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХреИрд╕реЗ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдгрд╛рд▓реА рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд╢рд╛рдпрдж рд╣рдо рдХреБрдЫ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред

@niemeyer рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореИрдВрдиреЗ RawMessage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдмрд╛рдж рдореЗрдВ MapSlice рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдерд╛ред рдореИрдВ рдЧреЛрд▓рд╛рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреЛ рд▓реЛрдЧ json.RawMessage рд╕рдордХрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ yaml.MapSlice рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдЗрд╕рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╣реЛрддрд╛, рддреЛ рд▓реЛрдЧ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдЙрдиреНрд╣реЗрдВ yaml.RawMessage рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@niemeyer рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реА yaml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреНрд▓рдЧрдЗрди рд╕реЗ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рднрд┐рдиреНрди рд╣реИ, рдореИрдВ рдкрд╛рд░реНрд╕ рдореЗрдВ рджреЗрд░реА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд▓рдЧрдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП RawMessage рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЕрд▓рдЧ yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреИрд╕рд╛ @missedone

рд╣рд╛рдБ, рдореИрдкрд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХреЛрдИ рдЗрд╕реЗ рдпрдорд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдорд╛рд░реНрд╢рд▓ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдХрдЪреНрдЪреЗ рдореИрд╕реЗрдЬ рдХреЗ рд╕рдЯреАрдХ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЕрдирдорд░реНрд╢рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреБрд▓рд╛ рд░рдЦреВрдВрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо RawMessage рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдЧреЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХреЗрдВред

рд╡реИрд╕реЗ, рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореИрдкрд╕реНрд▓рд╛рдЗрд╕ (рдпрд╛ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рджрд╛ map[string]interface{} ) рдХреЛ рд╕реАрдзреЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╣реЛ, рдмрд┐рдирд╛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдорд╛рд░реНрд╢рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗред

@dvirsky рдЬреЛ yaml рдкреИрдХреЗрдЬ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рд╕реЗ рдкрд░реЗ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рд╕реАрдзреЗ рдореИрдк-рдЯреВ-рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдкреИрдХреЗрдЬ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/mitchellh/mapstruct)ред

рдХреНрдпрд╛ рдпрд╣ UnmarshalYAML рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП unmarshal рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдмрд╛рдж рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

type RawMessage struct {
    unmarshal func(interface{}) error
}

func (msg *RawMessage) UnmarshalYAML(unmarshal func(interface{}) error) error {
    msg.unmarshal = unmarshal
    return nil
}

func (msg *RawMessage) Unmarshal(v interace{}) error {
    return msg.unmarshal(v)
}

рдлрд┐рд░ рдЖрдк рдмрд╛рдж рдореЗрдВ RawMessage.Unmarshal(v) рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

рд╣рд╛рдБ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ json.RawMessage рдЬреИрд╕рд╛ рднреА рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдмреАрдПрд╕рдУрдПрди рдФрд░ рдЬреЗрд╕рди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдк рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдорд╛рд░реНрд╢рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрдо рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗред рд╣рдореЗрдВ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдкрдХреНрд╖ рдкрд░ рдХреБрдЫ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд╕рдЪ рд╣реИ, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордорд┐рдд рдирд╣реАрдВ рд╣реИред

рдФрд░ рдмрд╣реБрдд рдирд╣реАрдВ _"рдХрдЪреНрдЪрд╛",_ рдпрджрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рд╣рдо рдПрдХ рд╕рдорд╛рди рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЖрд▓рд╕реА рдврдВрдЧ рд╕реЗ рдЕрдирдорд░реНрд╢рд▓ рдФрд░ рд░реА-рдорд╛рд░реНрд╢рд▓ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рда рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдВред

рдХреНрдпрд╛ yaml.MapSlice рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

рдореИрдВ json.RawMessage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП YAML рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдмреАрдЪ рдореЗрдВ рдПрдХ рдЬреЗрд╕рди рдбрд┐рдХреНрд╢рдирд░реА рд╣реЛрдирд╛ рдерд╛ред рд╡рд╣ рдЕрднреА рднреА рдорд╛рдиреНрдп рдпрдорд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

foo:
  bar: { "a" : 1 }
  baz:
    b: 2

рдХреЗрд╡рд▓ map[string]interface{} рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ (рдЕрд╡рд╛рдВрдЫрд┐рдд):

topdata := make(map[string]interface{})
foodata := make(map[string]interface{})
topdata["foo"] = foodata
foodata["bar"] = json.RawMessage(`{ "a" : 1 }`)
foodata["baz"] = map[string]interface{}{ "b" : 2 }
enc, _ := yaml.Marshal(topdata)
println(enc)

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, json.RawMessage рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛рдпрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░реАрдХреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ рдпрд╣ рдЕрднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ YAML json.RawMessage рдХреЗ рд╕рдорддреБрд▓реНрдп YAML "рдИрд╡реЗрдВрдЯреНрд╕" (рдЬреИрд╕реЗ рдореИрдк рд╕реНрдЯрд╛рд░реНрдЯ, рд╕реНрдХреЗрд▓рд░, рд╕реАрдХреНрд╡реЗрдВрд╕ рдПрдВрдб, рдЖрджрд┐) рдХрд╛ рдПрдХ рдкрд╛рд░реНрд╕реЗрдб рд╕реАрдХреНрд╡реЗрдВрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╕рдВрджрд░реНрдн-рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓ рддрд░реАрдХреЗ рд╕реЗ рдорд╛рд░реНрд╢рд▓ рдФрд░ рдЕрдирдорд░реНрд╢рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

+1
рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрдкрдиреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ:

var configData = `
name: test
version: 0
plugins:
  http:
    user: joe
    url: https://test.com
  region:
    name: oz
`

type Config struct {
    Name    string `yaml:"name"`
    Version string `yaml:"version"`
    Plugins map[string]interface{} `yaml:"plugins"`
}

// custom plugins can be defined outside of this package
type HttpPlugin struct {
    User string `yaml:"user"`
    Url  string `yaml:"url"`
}

type RegionPlugin struct {
    Name string `yaml:"name"`
}

func TestABC(t *testing.T) {

    var config Config
    err := yaml.Unmarshal([]byte(configData), &config)
    require.NoError(t, err)
    fmt.Printf("unmarshaled config:\n%+v\n\n", config)

    // again custom plugin can be defined outside of this package
    var http HttpPlugin
    err = UnmarshalPlugin(config.Plugins["http"], &http)
    require.NoError(t, err)
    fmt.Printf("unmarshaled http plugin:\n%+v\n", http)

    var region RegionPlugin
    err = UnmarshalPlugin(config.Plugins["region"], &region)
    require.NoError(t, err)
    fmt.Printf("unmarshal region plugin:\n%+v\n", region)
}

// takes interface, marshals back to []byte, then unmarshals to desired struct
func UnmarshalPlugin(pluginIn, pluginOut interface{}) error {

    b, err := yaml.Marshal(pluginIn)
    if err != nil {
        return err
    }
    return yaml.Unmarshal(b, pluginOut)
}

рдореВрд▓ рд░реВрдк рд╕реЗ рдХрдЪреНрдЪреЗ рд╕рдВрджреЗрд╢ рдХреЗ рдмрдЬрд╛рдп map[string]interface{} рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ UnmarshalPlugin

@ pete911 рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж!

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдкреНрд░рдХрд╛рд░ json.RawMessage (рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╕рдВрднрд╡рддрдГ yaml.RawMessage рд╣реЛрдЧрд╛) рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

+1
рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

+1

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА @tchap рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдзрд┐ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдЗрд╕рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ! рдпрджрд┐ рдЗрд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ yaml рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реА рддрд░рдл рд╕реЗ RawMessage рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ :)

рдЖрдк рдРрд╕реЗ RawMessage рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░, рдЕрдкрдиреА yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЦреЗрдВред

рд╕рдВрджрд░реНрдн: https://stackoverflow.com/a/21699210/1033539

+1

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

dmandelin picture dmandelin  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bcronin picture bcronin  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

RichiH picture RichiH  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

niemeyer picture niemeyer  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zubairhamed picture zubairhamed  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ