forked from mirror/go-json
Fix encoding for Indent/MarshalIndent
This commit is contained in:
parent
15b28f80fd
commit
8463646eb0
28
encode_vm.go
28
encode_vm.go
|
@ -147,12 +147,22 @@ func (e *Encoder) run(code *opcode) error {
|
|||
)
|
||||
}
|
||||
var buf bytes.Buffer
|
||||
if err := compact(&buf, b, true); err != nil {
|
||||
return err
|
||||
if e.enabledIndent {
|
||||
if err := encodeWithIndent(
|
||||
&buf,
|
||||
b,
|
||||
string(e.prefix)+string(bytes.Repeat(e.indentStr, code.indent)),
|
||||
string(e.indentStr),
|
||||
); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if err := compact(&buf, b, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
e.encodeBytes(buf.Bytes())
|
||||
code = code.next
|
||||
code.ptr = ptr
|
||||
case opMarshalText:
|
||||
ptr := code.ptr
|
||||
isPtr := code.typ.Kind() == reflect.Ptr
|
||||
|
@ -276,7 +286,7 @@ func (e *Encoder) run(code *opcode) error {
|
|||
} else {
|
||||
e.encodeByte('\n')
|
||||
e.encodeIndent(code.indent)
|
||||
e.encodeBytes([]byte{']'})
|
||||
e.encodeByte(']')
|
||||
code = c.end.next
|
||||
}
|
||||
case opArrayHead:
|
||||
|
@ -1352,15 +1362,19 @@ func (e *Encoder) run(code *opcode) error {
|
|||
field := code.toStructFieldCode()
|
||||
ptr := field.ptr
|
||||
if ptr == 0 {
|
||||
e.encodeIndent(code.indent)
|
||||
e.encodeNull()
|
||||
if code.op == opStructFieldPtrHeadIntIndent {
|
||||
e.encodeIndent(code.indent)
|
||||
e.encodeNull()
|
||||
} else {
|
||||
e.encodeBytes([]byte{'{', '}'})
|
||||
}
|
||||
code = field.end
|
||||
} else {
|
||||
e.encodeBytes([]byte{'{', '\n'})
|
||||
e.encodeIndent(code.indent + 1)
|
||||
e.encodeBytes(field.key)
|
||||
e.encodeByte(' ')
|
||||
e.encodeInt(e.ptrToInt(ptr))
|
||||
e.encodeInt(e.ptrToInt(ptr + field.offset))
|
||||
field.nextField.ptr = ptr
|
||||
code = field.next
|
||||
}
|
||||
|
|
|
@ -52,9 +52,10 @@ func encodeWithIndent(dst *bytes.Buffer, src []byte, prefix, indentStr string) e
|
|||
if indentNum < 0 {
|
||||
return errInvalidCharacter('}', "}", cursor)
|
||||
}
|
||||
b := []byte{'\n', c}
|
||||
b := []byte{'\n'}
|
||||
b = append(b, prefix...)
|
||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
||||
b = append(b, c)
|
||||
if _, err := dst.Write(b); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -78,9 +79,10 @@ func encodeWithIndent(dst *bytes.Buffer, src []byte, prefix, indentStr string) e
|
|||
if indentNum < 0 {
|
||||
return errInvalidCharacter(']', "]", cursor)
|
||||
}
|
||||
b := []byte{'\n', c}
|
||||
b := []byte{'\n'}
|
||||
b = append(b, prefix...)
|
||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
||||
b = append(b, c)
|
||||
if _, err := dst.Write(b); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue