@@ -349,6 +349,8 @@ type encOpts struct {
349349 quoted bool
350350 // escapeHTML causes '<', '>', and '&' to be escaped in JSON strings.
351351 escapeHTML bool
352+ // trustMarshaler causes Marshaler not to be compacted, escaped and validated.
353+ trustMarshaler bool
352354}
353355
354356type encoderFunc func (e * encodeState , v reflect.Value , opts encOpts )
@@ -462,8 +464,12 @@ func marshalerEncoder(e *encodeState, v reflect.Value, opts encOpts) {
462464 }
463465 b , err := m .MarshalJSON ()
464466 if err == nil {
465- // copy JSON into buffer, checking validity.
466- err = compact (& e .Buffer , b , opts .escapeHTML )
467+ // copy JSON in to buffer.
468+ if opts .trustMarshaler {
469+ _ , err = e .Buffer .Write (b )
470+ } else {
471+ err = compact (& e .Buffer , b , opts .escapeHTML )
472+ }
467473 }
468474 if err != nil {
469475 e .error (& MarshalerError {v .Type (), err , "MarshalJSON" })
@@ -479,8 +485,12 @@ func addrMarshalerEncoder(e *encodeState, v reflect.Value, opts encOpts) {
479485 m := va .Interface ().(Marshaler )
480486 b , err := m .MarshalJSON ()
481487 if err == nil {
482- // copy JSON into buffer, checking validity.
483- err = compact (& e .Buffer , b , opts .escapeHTML )
488+ // copy JSON in to buffer.
489+ if opts .trustMarshaler {
490+ _ , err = e .Buffer .Write (b )
491+ } else {
492+ err = compact (& e .Buffer , b , opts .escapeHTML )
493+ }
484494 }
485495 if err != nil {
486496 e .error (& MarshalerError {v .Type (), err , "MarshalJSON" })
0 commit comments