diff --git a/benchmarks/go.mod b/benchmarks/go.mod index 6aedd700..533d17ce 100644 --- a/benchmarks/go.mod +++ b/benchmarks/go.mod @@ -4,7 +4,9 @@ go 1.12 require ( github.com/francoispqt/gojay v1.2.13 - github.com/goccy/go-json v0.0.0-20200430045642-6a479c7159bf + github.com/goccy/go-json v0.0.0-00010101000000-000000000000 github.com/json-iterator/go v1.1.9 github.com/mailru/easyjson v0.7.1 ) + +replace github.com/goccy/go-json => ../ diff --git a/benchmarks/go.sum b/benchmarks/go.sum index f31d61ae..2a6b8fbd 100644 --- a/benchmarks/go.sum +++ b/benchmarks/go.sum @@ -25,16 +25,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/goccy/go-json v0.0.0-20200425134937-b2f2a20f6518 h1:Im9WLti1rM0Lu7yfI7Q4qUa63ACa8MpcWsKsP/s1scI= -github.com/goccy/go-json v0.0.0-20200425134937-b2f2a20f6518/go.mod h1:h37TlF6fMJkCKBvuOxM3yCc3CnzMOUL3Ya+zO4ERYXQ= -github.com/goccy/go-json v0.0.0-20200426030317-c37a3c1aac7b h1:x2rU3NmJ9v14sP8q6ibSDHWm3dAmEvVPjxiLAAz4iU0= -github.com/goccy/go-json v0.0.0-20200426030317-c37a3c1aac7b/go.mod h1:R/y4ycIiFvB+n4HQ2M0/BzGzFxFvgGk5wwIp4Q2JkCk= -github.com/goccy/go-json v0.0.0-20200426055945-3bd7507c309f h1:ZIUfVwBw7xpFIPp/7neJMAycPOv1HEbLsloc2FF6/mY= -github.com/goccy/go-json v0.0.0-20200426055945-3bd7507c309f/go.mod h1:R/y4ycIiFvB+n4HQ2M0/BzGzFxFvgGk5wwIp4Q2JkCk= -github.com/goccy/go-json v0.0.0-20200426062255-9b1349d40ab6 h1:vJLqMycJ1FZ5RAtM5uU2beB/1cw8CqhY/LQAsffUDTU= -github.com/goccy/go-json v0.0.0-20200426062255-9b1349d40ab6/go.mod h1:R/y4ycIiFvB+n4HQ2M0/BzGzFxFvgGk5wwIp4Q2JkCk= -github.com/goccy/go-json v0.0.0-20200430045642-6a479c7159bf h1:mnwIPeyuqSC+ADJsNaMkl3vlQc09zpHDzwNK83ftk9g= -github.com/goccy/go-json v0.0.0-20200430045642-6a479c7159bf/go.mod h1:R/y4ycIiFvB+n4HQ2M0/BzGzFxFvgGk5wwIp4Q2JkCk= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= diff --git a/encode.go b/encode.go index 728e3220..4eebbafe 100644 --- a/encode.go +++ b/encode.go @@ -11,13 +11,14 @@ import ( // An Encoder writes JSON values to an output stream. type Encoder struct { - w io.Writer - buf []byte - pool sync.Pool - enabledIndent bool - prefix []byte - indentStr []byte - indent int + w io.Writer + buf []byte + pool sync.Pool + enabledIndent bool + enabledHTMLEscape bool + prefix []byte + indentStr []byte + indent int } const ( @@ -65,7 +66,6 @@ func init() { func NewEncoder(w io.Writer) *Encoder { enc := encPool.Get().(*Encoder) enc.w = w - enc.indent = 0 enc.reset() return enc } @@ -88,7 +88,7 @@ func (e *Encoder) Encode(v interface{}) error { // // In non-HTML settings where the escaping interferes with the readability of the output, SetEscapeHTML(false) disables this behavior. func (e *Encoder) SetEscapeHTML(on bool) { - + e.enabledHTMLEscape = on } // SetIndent instructs the encoder to format each subsequent encoded value as if indented by the package-level function Indent(dst, src, prefix, indent). @@ -110,6 +110,9 @@ func (e *Encoder) release() { func (e *Encoder) reset() { e.buf = e.buf[:0] + e.indent = 0 + e.enabledHTMLEscape = true + e.enabledIndent = false } func (e *Encoder) encodeForMarshal(v interface{}) ([]byte, error) { @@ -225,9 +228,16 @@ func (e *Encoder) encodeBytes(b []byte) { e.buf = append(e.buf, b...) } +func (e *Encoder) encodeNull() { + e.buf = append(e.buf, 'n', 'u', 'l', 'l') +} + func (e *Encoder) encodeString(s string) { - b := *(*[]byte)(unsafe.Pointer(&s)) - e.buf = append(e.buf, b...) + if e.enabledHTMLEscape { + e.encodeEscapedString(s) + } else { + e.encodeNoEscapedString(s) + } } func (e *Encoder) encodeByte(b byte) { diff --git a/encode_string.go b/encode_string.go index 4d71b63d..93db0c06 100644 --- a/encode_string.go +++ b/encode_string.go @@ -305,3 +305,67 @@ func (e *Encoder) writeStringSlowPathWithHTMLEscaped(i int, s string, valLen int } e.buf = append(e.buf, '"') } + +func (e *Encoder) encodeNoEscapedString(s string) { + valLen := len(s) + e.buf = append(e.buf, '"') + + // write string, the fast path, without utf8 and escape support + i := 0 + for ; i < valLen; i++ { + c := s[i] + if c > 31 && c != '"' && c != '\\' { + e.buf = append(e.buf, c) + } else { + break + } + } + if i == valLen { + e.buf = append(e.buf, '"') + return + } + e.writeStringSlowPath(i, s, valLen) +} + +func (e *Encoder) writeStringSlowPath(i int, s string, valLen int) { + start := i + // for the remaining parts, we process them char by char + for i < valLen { + if b := s[i]; b < utf8.RuneSelf { + if safeSet[b] { + i++ + continue + } + if start < i { + e.buf = append(e.buf, s[start:i]...) + } + switch b { + case '\\', '"': + e.buf = append(e.buf, '\\', b) + case '\n': + e.buf = append(e.buf, '\\', 'n') + case '\r': + e.buf = append(e.buf, '\\', 'r') + case '\t': + e.buf = append(e.buf, '\\', 't') + default: + // This encodes bytes < 0x20 except for \t, \n and \r. + // If escapeHTML is set, it also escapes <, >, and & + // because they can lead to security holes when + // user-controlled strings are rendered into JSON + // and served to some browsers. + e.buf = append(e.buf, []byte(`\u00`)...) + e.buf = append(e.buf, hex[b>>4], hex[b&0xF]) + } + i++ + start = i + continue + } + i++ + continue + } + if start < len(s) { + e.buf = append(e.buf, s[start:]...) + } + e.buf = append(e.buf, '"') +} diff --git a/encode_vm.go b/encode_vm.go index f071d117..7739602f 100644 --- a/encode_vm.go +++ b/encode_vm.go @@ -49,7 +49,7 @@ func (e *Encoder) run(code *opcode) error { e.encodeFloat64(e.ptrToFloat64(code.ptr)) code = code.next case opString: - e.encodeEscapedString(e.ptrToString(code.ptr)) + e.encodeString(e.ptrToString(code.ptr)) code = code.next case opBool: e.encodeBool(e.ptrToBool(code.ptr)) @@ -78,7 +78,7 @@ func (e *Encoder) run(code *opcode) error { p := code.ptr headerCode := code.toSliceHeaderCode() if p == 0 { - e.encodeString("null") + e.encodeNull() code = headerCode.end.next } else { e.encodeByte('[') @@ -108,7 +108,7 @@ func (e *Encoder) run(code *opcode) error { headerCode := code.toSliceHeaderCode() if p == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = headerCode.end.next } else { e.encodeBytes([]byte{'[', '\n'}) @@ -143,7 +143,7 @@ func (e *Encoder) run(code *opcode) error { p := code.ptr headerCode := code.toArrayHeaderCode() if p == 0 { - e.encodeString("null") + e.encodeNull() code = headerCode.end.next } else { e.encodeByte('[') @@ -172,7 +172,7 @@ func (e *Encoder) run(code *opcode) error { headerCode := code.toArrayHeaderCode() if p == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = headerCode.end.next } else { e.encodeBytes([]byte{'[', '\n'}) @@ -205,7 +205,7 @@ func (e *Encoder) run(code *opcode) error { ptr := code.ptr mapHeadCode := code.toMapHeadCode() if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = mapHeadCode.end.next } else { e.encodeByte('{') @@ -246,7 +246,7 @@ func (e *Encoder) run(code *opcode) error { mapHeadCode := code.toMapHeadCode() if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = mapHeadCode.end.next } else { e.encodeBytes([]byte{'{', '\n'}) @@ -297,7 +297,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeByte('{') @@ -313,7 +313,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -329,7 +329,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -345,7 +345,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -361,7 +361,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -377,7 +377,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -393,7 +393,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -409,7 +409,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -425,7 +425,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -441,7 +441,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -457,7 +457,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -473,7 +473,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -489,7 +489,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -505,12 +505,12 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') e.encodeBytes(field.key) - e.encodeEscapedString(e.ptrToString(field.ptr + field.offset)) + e.encodeString(e.ptrToString(field.ptr + field.offset)) field.nextField.ptr = field.ptr code = field.next } @@ -521,7 +521,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeByte('{') @@ -541,7 +541,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -561,7 +561,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeBytes([]byte{'{', '\n'}) @@ -580,7 +580,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -599,7 +599,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -619,7 +619,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -639,7 +639,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -659,7 +659,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -679,7 +679,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -699,7 +699,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -719,7 +719,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -739,7 +739,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -759,7 +759,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -779,7 +779,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -799,7 +799,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -807,7 +807,7 @@ func (e *Encoder) run(code *opcode) error { e.encodeIndent(code.indent + 1) e.encodeBytes(field.key) e.encodeByte(' ') - e.encodeEscapedString(e.ptrToString(field.ptr + field.offset)) + e.encodeString(e.ptrToString(field.ptr + field.offset)) field.nextField.ptr = field.ptr code = field.next } @@ -819,7 +819,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end } else { e.encodeIndent(code.indent) @@ -840,7 +840,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -865,7 +865,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -890,7 +890,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -915,7 +915,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -940,7 +940,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -965,7 +965,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -990,7 +990,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1015,7 +1015,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1040,7 +1040,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1065,7 +1065,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1090,7 +1090,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1115,7 +1115,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1140,7 +1140,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1165,7 +1165,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1176,7 +1176,7 @@ func (e *Encoder) run(code *opcode) error { } else { e.encodeIndent(code.indent + 1) e.encodeBytes(field.key) - e.encodeEscapedString(v) + e.encodeString(v) code = field.next } field.nextField.ptr = field.ptr @@ -1190,7 +1190,7 @@ func (e *Encoder) run(code *opcode) error { field := code.toStructFieldCode() ptr := field.ptr if ptr == 0 { - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1217,7 +1217,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1244,7 +1244,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1271,7 +1271,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1298,7 +1298,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1325,7 +1325,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1352,7 +1352,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1379,7 +1379,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1406,7 +1406,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1433,7 +1433,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1460,7 +1460,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1487,7 +1487,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1514,7 +1514,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1541,7 +1541,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1568,7 +1568,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1580,7 +1580,7 @@ func (e *Encoder) run(code *opcode) error { e.encodeIndent(code.indent + 1) e.encodeBytes(field.key) e.encodeByte(' ') - e.encodeEscapedString(v) + e.encodeString(v) code = field.next } field.nextField.ptr = field.ptr @@ -1595,7 +1595,7 @@ func (e *Encoder) run(code *opcode) error { ptr := field.ptr if ptr == 0 { e.encodeIndent(code.indent) - e.encodeString("null") + e.encodeNull() code = field.end.next } else { e.encodeIndent(code.indent) @@ -1708,7 +1708,7 @@ func (e *Encoder) run(code *opcode) error { c := code.toStructFieldCode() c.nextField.ptr = c.ptr e.encodeBytes(c.key) - e.encodeEscapedString(e.ptrToString(c.ptr + c.offset)) + e.encodeString(e.ptrToString(c.ptr + c.offset)) code = code.next case opStructFieldBool: e.encodeByte(',') @@ -1841,7 +1841,7 @@ func (e *Encoder) run(code *opcode) error { e.encodeIndent(c.indent) e.encodeBytes(c.key) e.encodeByte(' ') - e.encodeEscapedString(e.ptrToString(c.ptr + c.offset)) + e.encodeString(e.ptrToString(c.ptr + c.offset)) code = code.next c.nextField.ptr = c.ptr case opStructFieldBoolIndent: @@ -2019,7 +2019,7 @@ func (e *Encoder) run(code *opcode) error { e.encodeByte(',') } e.encodeBytes(c.key) - e.encodeEscapedString(v) + e.encodeString(v) } code = code.next code.ptr = c.ptr @@ -2230,7 +2230,7 @@ func (e *Encoder) run(code *opcode) error { e.encodeIndent(c.indent) e.encodeBytes(c.key) e.encodeByte(' ') - e.encodeEscapedString(v) + e.encodeString(v) } code = code.next code.ptr = c.ptr diff --git a/json.go b/json.go index b4d46233..b341a81e 100644 --- a/json.go +++ b/json.go @@ -5,7 +5,6 @@ import "bytes" func Marshal(v interface{}) ([]byte, error) { var b *bytes.Buffer enc := NewEncoder(b) - enc.SetIndent("", "") bytes, err := enc.encodeForMarshal(v) if err != nil { enc.release()