Skip to content

Commit 098b626

Browse files
cesparebradfitz
authored andcommitted
encoding/json: add (*Encoder).Indent
Fixes #6492. Change-Id: Ibc633c43a6d134bb140addb59780a5758b35a5c5 Reviewed-on: https://go-review.googlesource.com/21057 Run-TryBot: Caleb Spare <cespare@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
1 parent ba333a3 commit 098b626

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/encoding/json/stream.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,10 @@ func nonSpace(b []byte) bool {
168168
type Encoder struct {
169169
w io.Writer
170170
err error
171+
172+
indentBuf *bytes.Buffer
173+
indentPrefix string
174+
indentValue string
171175
}
172176

173177
// NewEncoder returns a new encoder that writes to w.
@@ -198,13 +202,29 @@ func (enc *Encoder) Encode(v interface{}) error {
198202
// digits coming.
199203
e.WriteByte('\n')
200204

201-
if _, err = enc.w.Write(e.Bytes()); err != nil {
205+
b := e.Bytes()
206+
if enc.indentBuf != nil {
207+
enc.indentBuf.Reset()
208+
err = Indent(enc.indentBuf, b, enc.indentPrefix, enc.indentValue)
209+
if err != nil {
210+
return err
211+
}
212+
b = enc.indentBuf.Bytes()
213+
}
214+
if _, err = enc.w.Write(b); err != nil {
202215
enc.err = err
203216
}
204217
encodeStatePool.Put(e)
205218
return err
206219
}
207220

221+
// Indent sets the encoder to format each encoded object with Indent.
222+
func (enc *Encoder) Indent(prefix, indent string) {
223+
enc.indentBuf = new(bytes.Buffer)
224+
enc.indentPrefix = prefix
225+
enc.indentValue = indent
226+
}
227+
208228
// RawMessage is a raw encoded JSON object.
209229
// It implements Marshaler and Unmarshaler and can
210230
// be used to delay JSON decoding or precompute a JSON encoding.

src/encoding/json/stream_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,36 @@ func TestEncoder(t *testing.T) {
5757
}
5858
}
5959

60+
var streamEncodedIndent = `0.1
61+
"hello"
62+
null
63+
true
64+
false
65+
[
66+
>."a",
67+
>."b",
68+
>."c"
69+
>]
70+
{
71+
>."ß": "long s",
72+
>."K": "Kelvin"
73+
>}
74+
3.14
75+
`
76+
77+
func TestEncoderIndent(t *testing.T) {
78+
var buf bytes.Buffer
79+
enc := NewEncoder(&buf)
80+
enc.Indent(">", ".")
81+
for _, v := range streamTest {
82+
enc.Encode(v)
83+
}
84+
if have, want := buf.String(), streamEncodedIndent; have != want {
85+
t.Error("indented encoding mismatch")
86+
diff(t, []byte(have), []byte(want))
87+
}
88+
}
89+
6090
func TestDecoder(t *testing.T) {
6191
for i := 0; i <= len(streamTest); i++ {
6292
// Use stream without newlines as input,

0 commit comments

Comments
 (0)