Bläddra i källkod

detect remaining bytes

Tao Wen 7 år sedan
förälder
incheckning
be70f29b04
3 ändrade filer med 19 tillägg och 27 borttagningar
  1. 0 9
      adapter.go
  2. 14 18
      config.go
  3. 5 0
      value_tests/struct_test.go

+ 0 - 9
adapter.go

@@ -16,15 +16,6 @@ func Unmarshal(data []byte, v interface{}) error {
 	return ConfigDefault.Unmarshal(data, v)
 }
 
-func lastNotSpacePos(data []byte) int {
-	for i := len(data) - 1; i >= 0; i-- {
-		if data[i] != ' ' && data[i] != '\t' && data[i] != '\r' && data[i] != '\n' {
-			return i + 1
-		}
-	}
-	return 0
-}
-
 // UnmarshalFromString convenient method to read from string instead of []byte
 func UnmarshalFromString(str string, v interface{}) error {
 	return ConfigDefault.UnmarshalFromString(str, v)

+ 14 - 18
config.go

@@ -249,19 +249,17 @@ func (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([]
 
 func (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error {
 	data := []byte(str)
-	data = data[:lastNotSpacePos(data)]
 	iter := cfg.BorrowIterator(data)
 	defer cfg.ReturnIterator(iter)
 	iter.ReadVal(v)
-	if iter.head == iter.tail {
-		iter.loadMore()
-	}
-	if iter.Error == io.EOF {
-		return nil
-	}
-	if iter.Error == nil {
-		iter.ReportError("UnmarshalFromString", "there are bytes left after unmarshal")
+	c := iter.nextToken()
+	if c == 0 {
+		if iter.Error == io.EOF {
+			return nil
+		}
+		return iter.Error
 	}
+	iter.ReportError("Unmarshal", "there are bytes left after unmarshal")
 	return iter.Error
 }
 
@@ -272,19 +270,17 @@ func (cfg *frozenConfig) Get(data []byte, path ...interface{}) Any {
 }
 
 func (cfg *frozenConfig) Unmarshal(data []byte, v interface{}) error {
-	data = data[:lastNotSpacePos(data)]
 	iter := cfg.BorrowIterator(data)
 	defer cfg.ReturnIterator(iter)
 	iter.ReadVal(v)
-	if iter.head == iter.tail {
-		iter.loadMore()
-	}
-	if iter.Error == io.EOF {
-		return nil
-	}
-	if iter.Error == nil {
-		iter.ReportError("Unmarshal", "there are bytes left after unmarshal")
+	c := iter.nextToken()
+	if c == 0 {
+		if iter.Error == io.EOF {
+			return nil
+		}
+		return iter.Error
 	}
+	iter.ReportError("Unmarshal", "there are bytes left after unmarshal")
 	return iter.Error
 }
 

+ 5 - 0
value_tests/struct_test.go

@@ -16,6 +16,11 @@ func init() {
 			Field interface{}
 		})(nil),
 		input: `{"Field": "hello"}`,
+	}, unmarshalCase{
+		ptr: (*struct {
+			Field interface{}
+		})(nil),
+		input: `{"Field": "hello"}       `,
 	}, unmarshalCase{
 		ptr: (*struct {
 			Field int `json:"field"`