1
0
mirror of https://github.com/json-iterator/go.git synced 2025-03-20 20:54:55 +02:00

check object end

This commit is contained in:
Tao Wen 2017-07-06 16:04:52 +08:00
parent 8700644196
commit f7df62f1b5
3 changed files with 43 additions and 10 deletions

@ -154,6 +154,18 @@ func (iter *Iterator) skipWhitespacesWithoutLoadMore() bool {
return true
}
func (iter *Iterator) isObjectEnd() bool {
c := iter.nextToken()
if c == ',' {
return false
}
if c == '}' {
return true
}
iter.ReportError("isObjectEnd", "object ended prematurely")
return true
}
func (iter *Iterator) nextToken() byte {
// a variation of skip whitespaces, returning the next non-whitespace token
for {

@ -586,7 +586,7 @@ func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator)
} else {
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -616,7 +616,7 @@ func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -650,7 +650,7 @@ func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -688,7 +688,7 @@ func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -730,7 +730,7 @@ func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -776,7 +776,7 @@ func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -826,7 +826,7 @@ func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -880,7 +880,7 @@ func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -938,7 +938,7 @@ func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}
@ -1000,7 +1000,7 @@ func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator
default:
iter.Skip()
}
if iter.nextToken() != ',' {
if iter.isObjectEnd() {
break
}
}

21
jsoniter_invalid_test.go Normal file

@ -0,0 +1,21 @@
package jsoniter
import (
"testing"
"github.com/json-iterator/go/require"
)
func Test_missing_object_end(t *testing.T) {
should := require.New(t)
type TestObject struct {
Metric string `json:"metric"`
Tags map[string]interface{} `json:"tags"`
}
obj := TestObject{}
should.NotNil(UnmarshalFromString(`{"metric": "sys.777","tags": {"a":"123"}`, &obj))
}
func Test_missing_array_end(t *testing.T) {
should := require.New(t)
should.NotNil(UnmarshalFromString(`[1,2,3`, &[]int{}))
}