aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/json/v2_stream.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding/json/v2_stream.go')
-rw-r--r--src/encoding/json/v2_stream.go19
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
}