diff --git a/gen/decoder.go b/gen/decoder.go index 02a3dfa..ab79869 100644 --- a/gen/decoder.go +++ b/gen/decoder.go @@ -240,7 +240,13 @@ func (g *Generator) genTypeDecoderNoCheck(t reflect.Type, out string, tags field fmt.Fprintln(g.out, ws+" }") fmt.Fprintln(g.out, ws+" for !in.IsDelim('}') {") - if keyDec != "" { + // NOTE: extra check for TextUnmarshaler. It overrides default methods. + if reflect.PtrTo(key).Implements(reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()) { + fmt.Fprintln(g.out, ws+" var key "+g.getType(key)) + fmt.Fprintln(g.out, ws+"if data := in.UnsafeBytes(); in.Ok() {") + fmt.Fprintln(g.out, ws+" in.AddError(key.UnmarshalText(data) )") + fmt.Fprintln(g.out, ws+"}") + } else if keyDec != "" { fmt.Fprintln(g.out, ws+" key := "+g.getType(key)+"("+keyDec+")") } else { fmt.Fprintln(g.out, ws+" var key "+g.getType(key)) diff --git a/gen/encoder.go b/gen/encoder.go index 037efce..5c29a8a 100644 --- a/gen/encoder.go +++ b/gen/encoder.go @@ -223,7 +223,9 @@ func (g *Generator) genTypeEncoderNoCheck(t reflect.Type, in string, tags fieldT fmt.Fprintln(g.out, ws+" "+tmpVar+"First := true") fmt.Fprintln(g.out, ws+" for "+tmpVar+"Name, "+tmpVar+"Value := range "+in+" {") fmt.Fprintln(g.out, ws+" if "+tmpVar+"First { "+tmpVar+"First = false } else { out.RawByte(',') }") - if key.Implements(reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()) { + + // NOTE: extra check for TextMarshaler. It overrides default methods. + if reflect.PtrTo(key).Implements(reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()) { fmt.Fprintln(g.out, ws+" "+fmt.Sprintf("out.RawText(("+tmpVar+"Name).MarshalText()"+")")) } else if keyEnc != "" { fmt.Fprintln(g.out, ws+" "+fmt.Sprintf(keyEnc, tmpVar+"Name"))