mirror of
https://github.com/json-iterator/go.git
synced 2024-11-27 08:30:57 +02:00
use json.Marshaler then trim the last '\n' in reflect_marshaler
N/A
This commit is contained in:
parent
27518f6661
commit
976454858b
47
api_tests/marshal_json_escape_test.go
Normal file
47
api_tests/marshal_json_escape_test.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
var marshalConfig = jsoniter.Config{
|
||||||
|
EscapeHTML: false,
|
||||||
|
SortMapKeys: true,
|
||||||
|
ValidateJsonRawMessage: true,
|
||||||
|
}.Froze()
|
||||||
|
|
||||||
|
type Container struct {
|
||||||
|
Bar interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Container) MarshalJSON() ([]byte, error) {
|
||||||
|
return marshalConfig.Marshal(&c.Bar)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEncodeEscape(t *testing.T) {
|
||||||
|
should := require.New(t)
|
||||||
|
|
||||||
|
container := &Container{
|
||||||
|
Bar: []string{"123<ab>", "ooo"},
|
||||||
|
}
|
||||||
|
out, err := marshalConfig.Marshal(container)
|
||||||
|
should.Nil(err)
|
||||||
|
bufout := string(out)
|
||||||
|
|
||||||
|
var stdbuf bytes.Buffer
|
||||||
|
stdenc := json.NewEncoder(&stdbuf)
|
||||||
|
stdenc.SetEscapeHTML(false)
|
||||||
|
err = stdenc.Encode(container)
|
||||||
|
should.Nil(err)
|
||||||
|
stdout := string(stdbuf.Bytes())
|
||||||
|
if stdout[len(stdout)-1:] == "\n" {
|
||||||
|
stdout = stdout[:len(stdout)-1]
|
||||||
|
}
|
||||||
|
|
||||||
|
should.Equal(stdout, bufout)
|
||||||
|
}
|
@ -3,8 +3,9 @@ package jsoniter
|
|||||||
import (
|
import (
|
||||||
"encoding"
|
"encoding"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/modern-go/reflect2"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/modern-go/reflect2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var marshalerType = reflect2.TypeOfPtr((*json.Marshaler)(nil)).Elem()
|
var marshalerType = reflect2.TypeOfPtr((*json.Marshaler)(nil)).Elem()
|
||||||
@ -93,10 +94,17 @@ func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
|
|||||||
stream.WriteNil()
|
stream.WriteNil()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
bytes, err := json.Marshal(obj)
|
marshaler := obj.(json.Marshaler)
|
||||||
|
bytes, err := marshaler.MarshalJSON()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
stream.Error = err
|
stream.Error = err
|
||||||
} else {
|
} else {
|
||||||
|
// html escape was already done by jsoniter
|
||||||
|
// but the extra '\n' should be trimed
|
||||||
|
l := len(bytes)
|
||||||
|
if l > 0 && bytes[l-1] == '\n' {
|
||||||
|
bytes = bytes[:l-1]
|
||||||
|
}
|
||||||
stream.Write(bytes)
|
stream.Write(bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user