Compare commits

...

4 Commits

Author SHA1 Message Date
Vadim Inshakov c5e60aeec1
Merge c360573ff8 into 3e9769d637 2024-11-22 06:54:38 +00:00
Masaaki Goshima 3e9769d637
Update go.yml 2024-11-11 12:13:39 +09:00
Andrey Grazhdankov 65c8b28ca1
Fix encode []*time.Time - check nil (#524) 2024-11-11 11:10:21 +09:00
Vadim Inshakov c360573ff8 Set (*Stream).bufSize equal to size of (*Stream).buf when it resized 2023-02-15 20:28:26 +05:00
5 changed files with 30 additions and 1 deletions

View File

@ -12,7 +12,7 @@ jobs:
- name: checkout - name: checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: build - name: build
run: docker-compose run go-json run: docker compose run go-json
test: test:
name: Test name: Test

View File

@ -274,6 +274,24 @@ func Test_Decoder_UseNumber(t *testing.T) {
assertEq(t, "json.Number", "json.Number", fmt.Sprintf("%T", v["a"])) assertEq(t, "json.Number", "json.Number", fmt.Sprintf("%T", v["a"]))
} }
func Test_Decoder_UnexpectedEnd(t *testing.T) {
input := []byte("\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe200")
dec := json.NewDecoder(bytes.NewReader(input))
for {
_, err := dec.Token()
if err != nil {
var e *json.SyntaxError
if errors.As(err, &e) {
assertEq(t, "error is not expected by test", e.Error(), "json: string unexpected end of JSON input")
break
}
t.Fatal(err)
}
}
}
func Test_Decoder_DisallowUnknownFields(t *testing.T) { func Test_Decoder_DisallowUnknownFields(t *testing.T) {
dec := json.NewDecoder(strings.NewReader(`{"x": 1}`)) dec := json.NewDecoder(strings.NewReader(`{"x": 1}`))
dec.DisallowUnknownFields() dec.DisallowUnknownFields()

View File

@ -426,6 +426,11 @@ func Test_Marshal(t *testing.T) {
assertErr(t, err) assertErr(t, err)
assertEq(t, "[]interface{}", `[1,2.1,"hello"]`, string(bytes)) assertEq(t, "[]interface{}", `[1,2.1,"hello"]`, string(bytes))
}) })
t.Run("[]*time.Time", func(t *testing.T) {
bytes, err := json.Marshal([]*time.Time{nil})
assertErr(t, err)
assertEq(t, "[]*time.Time", `[null]`, string(bytes))
})
}) })
t.Run("array", func(t *testing.T) { t.Run("array", func(t *testing.T) {

View File

@ -270,6 +270,7 @@ func stringBytes(s *Stream) ([]byte, error) {
r, size := utf8.DecodeRune(s.buf[cursor:]) r, size := utf8.DecodeRune(s.buf[cursor:])
if r == utf8.RuneError { if r == utf8.RuneError {
s.buf = append(append(append([]byte{}, s.buf[:cursor]...), runeErrBytes...), s.buf[cursor+1:]...) s.buf = append(append(append([]byte{}, s.buf[:cursor]...), runeErrBytes...), s.buf[cursor+1:]...)
s.bufSize = int64(len(s.buf))
cursor += runeErrBytesLen cursor += runeErrBytesLen
s.length += runeErrBytesLen s.length += runeErrBytesLen
_, _, p = s.stat() _, _, p = s.stat()

View File

@ -406,6 +406,11 @@ func AppendMarshalJSON(ctx *RuntimeContext, code *Opcode, b []byte, v interface{
rv = newV rv = newV
} }
} }
if rv.Kind() == reflect.Ptr && rv.IsNil() {
return AppendNull(ctx, b), nil
}
v = rv.Interface() v = rv.Interface()
var bb []byte var bb []byte
if (code.Flags & MarshalerContextFlags) != 0 { if (code.Flags & MarshalerContextFlags) != 0 {