diff options
Diffstat (limited to 'src/encoding/json/v2_stream.go')
| -rw-r--r-- | src/encoding/json/v2_stream.go | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/encoding/json/v2_stream.go b/src/encoding/json/v2_stream.go index ca0822cb73..ee16629cbb 100644 --- a/src/encoding/json/v2_stream.go +++ b/src/encoding/json/v2_stream.go @@ -96,7 +96,6 @@ type Encoder struct { opts jsonv2.Options err error - buf bytes.Buffer indentBuf bytes.Buffer indentPrefix string @@ -121,21 +120,22 @@ func (enc *Encoder) Encode(v any) error { return enc.err } - buf := &enc.buf - buf.Reset() - if err := jsonv2.MarshalWrite(buf, v, enc.opts); err != nil { + e := export.GetBufferedEncoder(enc.opts) + defer export.PutBufferedEncoder(e) + if err := jsonv2.MarshalEncode(e, v); err != nil { return err } + b := export.Encoder(e).Buf // b must not leak current scope if len(enc.indentPrefix)+len(enc.indentValue) > 0 { enc.indentBuf.Reset() - if err := Indent(&enc.indentBuf, buf.Bytes(), enc.indentPrefix, enc.indentValue); err != nil { + if err := Indent(&enc.indentBuf, b, enc.indentPrefix, enc.indentValue); err != nil { return err } - buf = &enc.indentBuf + b = enc.indentBuf.Bytes() } - buf.WriteByte('\n') + b = append(b, '\n') - if _, err := enc.w.Write(buf.Bytes()); err != nil { + if _, err := enc.w.Write(b); err != nil { enc.err = err return err } @@ -146,6 +146,9 @@ func (enc *Encoder) Encode(v any) error { // value as if indented by the package-level function Indent(dst, src, prefix, indent). // Calling SetIndent("", "") disables indentation. func (enc *Encoder) SetIndent(prefix, indent string) { + // NOTE: Do not rely on the newer [jsontext.WithIndent] option since + // the v1 [Indent] behavior has historical bugs that cannot be changed + // for backward compatibility reasons. enc.indentPrefix = prefix enc.indentValue = indent } |
