1
0
mirror of https://github.com/json-iterator/go.git synced 2025-02-13 19:41:56 +02:00

#159 fix fuzzy decoder, the newIter assigned io.EOF error to original iterator, which stopped further processing

This commit is contained in:
Tao Wen 2017-09-06 00:31:25 +08:00
parent db32ee8c2d
commit 8c7fc7584a
2 changed files with 25 additions and 3 deletions

View File

@ -7,6 +7,7 @@ import (
"reflect"
"strings"
"unsafe"
"io"
)
const maxUint = ^uint(0)
@ -206,7 +207,7 @@ func (decoder *fuzzyIntegerDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It
defer iter.Pool().ReturnIterator(newIter)
isFloat := strings.IndexByte(str, '.') != -1
decoder.fun(isFloat, ptr, newIter)
if newIter.Error != nil {
if newIter.Error != nil && newIter.Error != io.EOF {
iter.Error = newIter.Error
}
}
@ -225,7 +226,7 @@ func (decoder *fuzzyFloat32Decoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It
newIter := iter.Pool().BorrowIterator([]byte(str))
defer iter.Pool().ReturnIterator(newIter)
*((*float32)(ptr)) = newIter.ReadFloat32()
if newIter.Error != nil {
if newIter.Error != nil && newIter.Error != io.EOF {
iter.Error = newIter.Error
}
default:
@ -247,7 +248,7 @@ func (decoder *fuzzyFloat64Decoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It
newIter := iter.Pool().BorrowIterator([]byte(str))
defer iter.Pool().ReturnIterator(newIter)
*((*float64)(ptr)) = newIter.ReadFloat64()
if newIter.Error != nil {
if newIter.Error != nil && newIter.Error != io.EOF {
iter.Error = newIter.Error
}
default:

View File

@ -257,3 +257,24 @@ func Test_empty_array_as_object(t *testing.T) {
should.Nil(jsoniter.UnmarshalFromString(`[]`, &val))
should.Equal(struct{}{}, val)
}
func Test_bad_case(t *testing.T) {
var jsonstr = `
{
"extra_type": 181760,
"combo_type": 0,
"trigger_time_ms": 1498800398000,
"_create_time": "2017-06-16 11:21:39",
"_msg_type": 41000
}
`
type OrderEventRequestParams struct {
ExtraType uint64 `json:"extra_type"`
}
var a OrderEventRequestParams
err := jsoniter.UnmarshalFromString(jsonstr, &a)
should := require.New(t)
should.Nil(err)
}