1package yaml 2 3import ( 4 "bytes" 5 "encoding/json" 6 "errors" 7 "reflect" 8 9 goyaml "gopkg.in/yaml.v3" 10) 11 12type KeyJSON struct { 13 EscapeHTML bool 14} 15 16func (k *KeyJSON) Marshal(v interface{}) ([]byte, error) { 17 keyJSON := &bytes.Buffer{} 18 jsonEnc := json.NewEncoder(keyJSON) 19 jsonEnc.SetEscapeHTML(k.EscapeHTML) 20 if err := jsonEnc.Encode(v); err != nil { 21 return nil, err 22 } 23 return keyJSON.Bytes()[:keyJSON.Len()-1], nil 24} 25 26func (k *KeyJSON) Unmarshal(src []byte, v interface{}) error { 27 if !json.Valid(src) { 28 var null interface{} 29 err := json.Unmarshal(src, &null) 30 if err == nil { 31 err = errors.New("invalid JSON") 32 } 33 return err 34 } 35 r := bytes.NewReader(src) 36 var node goyaml.Node 37 if err := goyaml.NewDecoder(r).Decode(&node); err != nil { 38 return err 39 } 40 dec := &Decoder{} 41 out, err := dec.Decode(&node) 42 if err != nil { 43 return err 44 } 45 val := reflect.ValueOf(v).Elem() 46 if !val.CanSet() { 47 return errors.New("cannot set value") 48 } 49 val.Set(reflect.ValueOf(out)) 50 return nil 51} 52