mirror of https://github.com/goccy/go-json.git
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
|
var buf bytes.Buffer
|
||||||
if err := compact(&buf, b, true); err != nil {
|
if e.enabledIndent {
|
||||||
return err
|
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())
|
e.encodeBytes(buf.Bytes())
|
||||||
code = code.next
|
code = code.next
|
||||||
code.ptr = ptr
|
|
||||||
case opMarshalText:
|
case opMarshalText:
|
||||||
ptr := code.ptr
|
ptr := code.ptr
|
||||||
isPtr := code.typ.Kind() == reflect.Ptr
|
isPtr := code.typ.Kind() == reflect.Ptr
|
||||||
|
@ -276,7 +286,7 @@ func (e *Encoder) run(code *opcode) error {
|
||||||
} else {
|
} else {
|
||||||
e.encodeByte('\n')
|
e.encodeByte('\n')
|
||||||
e.encodeIndent(code.indent)
|
e.encodeIndent(code.indent)
|
||||||
e.encodeBytes([]byte{']'})
|
e.encodeByte(']')
|
||||||
code = c.end.next
|
code = c.end.next
|
||||||
}
|
}
|
||||||
case opArrayHead:
|
case opArrayHead:
|
||||||
|
@ -1352,15 +1362,19 @@ func (e *Encoder) run(code *opcode) error {
|
||||||
field := code.toStructFieldCode()
|
field := code.toStructFieldCode()
|
||||||
ptr := field.ptr
|
ptr := field.ptr
|
||||||
if ptr == 0 {
|
if ptr == 0 {
|
||||||
e.encodeIndent(code.indent)
|
if code.op == opStructFieldPtrHeadIntIndent {
|
||||||
e.encodeNull()
|
e.encodeIndent(code.indent)
|
||||||
|
e.encodeNull()
|
||||||
|
} else {
|
||||||
|
e.encodeBytes([]byte{'{', '}'})
|
||||||
|
}
|
||||||
code = field.end
|
code = field.end
|
||||||
} else {
|
} else {
|
||||||
e.encodeBytes([]byte{'{', '\n'})
|
e.encodeBytes([]byte{'{', '\n'})
|
||||||
e.encodeIndent(code.indent + 1)
|
e.encodeIndent(code.indent + 1)
|
||||||
e.encodeBytes(field.key)
|
e.encodeBytes(field.key)
|
||||||
e.encodeByte(' ')
|
e.encodeByte(' ')
|
||||||
e.encodeInt(e.ptrToInt(ptr))
|
e.encodeInt(e.ptrToInt(ptr + field.offset))
|
||||||
field.nextField.ptr = ptr
|
field.nextField.ptr = ptr
|
||||||
code = field.next
|
code = field.next
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,9 +52,10 @@ func encodeWithIndent(dst *bytes.Buffer, src []byte, prefix, indentStr string) e
|
||||||
if indentNum < 0 {
|
if indentNum < 0 {
|
||||||
return errInvalidCharacter('}', "}", cursor)
|
return errInvalidCharacter('}', "}", cursor)
|
||||||
}
|
}
|
||||||
b := []byte{'\n', c}
|
b := []byte{'\n'}
|
||||||
b = append(b, prefix...)
|
b = append(b, prefix...)
|
||||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
||||||
|
b = append(b, c)
|
||||||
if _, err := dst.Write(b); err != nil {
|
if _, err := dst.Write(b); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -78,9 +79,10 @@ func encodeWithIndent(dst *bytes.Buffer, src []byte, prefix, indentStr string) e
|
||||||
if indentNum < 0 {
|
if indentNum < 0 {
|
||||||
return errInvalidCharacter(']', "]", cursor)
|
return errInvalidCharacter(']', "]", cursor)
|
||||||
}
|
}
|
||||||
b := []byte{'\n', c}
|
b := []byte{'\n'}
|
||||||
b = append(b, prefix...)
|
b = append(b, prefix...)
|
||||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
||||||
|
b = append(b, c)
|
||||||
if _, err := dst.Write(b); err != nil {
|
if _, err := dst.Write(b); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue