From dff6a319fb854b9cff23a0a0a76417d57a1ec1e1 Mon Sep 17 00:00:00 2001 From: dd Date: Thu, 22 Sep 2016 21:28:05 +0300 Subject: [PATCH] Use MarshalJSON() instead of json.Marshal() for interface type if it implements json.Marshaler --- gen/encoder.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gen/encoder.go b/gen/encoder.go index 4bac8e8..55b12ff 100644 --- a/gen/encoder.go +++ b/gen/encoder.go @@ -180,7 +180,11 @@ func (g *Generator) genTypeEncoderNoCheck(t reflect.Type, in string, tags fieldT if t.NumMethod() != 0 { return fmt.Errorf("interface type %v not supported: only interface{} is allowed", t) } - fmt.Fprintln(g.out, ws+"out.Raw(json.Marshal("+in+"))") + fmt.Fprintln(g.out, ws+"if m, ok := "+in+".(json.Marshaler); ok {") + fmt.Fprintln(g.out, ws+" out.Raw(m.MarshalJSON())") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" out.Raw(json.Marshal("+in+"))") + fmt.Fprintln(g.out, ws+"}") default: return fmt.Errorf("don't know how to encode %v", t)