diff --git a/feature_iter.go b/feature_iter.go
index 2683b95..05fc9ee 100644
--- a/feature_iter.go
+++ b/feature_iter.go
@@ -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 {
diff --git a/feature_reflect_object.go b/feature_reflect_object.go
index dcfca2b..c815a94 100644
--- a/feature_reflect_object.go
+++ b/feature_reflect_object.go
@@ -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
 		}
 	}
diff --git a/jsoniter_invalid_test.go b/jsoniter_invalid_test.go
new file mode 100644
index 0000000..e764b57
--- /dev/null
+++ b/jsoniter_invalid_test.go
@@ -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{}))
+}