diff --git a/dec_bool.go b/dec_bool.go index 5795306..1220395 100644 --- a/dec_bool.go +++ b/dec_bool.go @@ -2,6 +2,10 @@ package jx // Bool reads a json object as Bool func (d *Decoder) Bool() (bool, error) { + if err := d.skipSpace(); err != nil { + return false, err + } + var buf [4]byte if err := d.readExact4(&buf); err != nil { return false, err diff --git a/dec_null.go b/dec_null.go index 6d26d6b..d109226 100644 --- a/dec_null.go +++ b/dec_null.go @@ -3,6 +3,10 @@ package jx // Null reads a json object as null and // returns whether it's a null or not. func (d *Decoder) Null() error { + if err := d.skipSpace(); err != nil { + return err + } + var buf [4]byte if err := d.readExact4(&buf); err != nil { return err diff --git a/dec_skip.go b/dec_skip.go index 49de031..a50c5a7 100644 --- a/dec_skip.go +++ b/dec_skip.go @@ -458,3 +458,15 @@ func (d *Decoder) skipArr() error { } } } + +// skipSpace skips space characters. +// +// Returns io.ErrUnexpectedEOF if got io.EOF. +func (d *Decoder) skipSpace() error { + // Skip space. + if _, err := d.more(); err != nil { + return err + } + d.unread() + return nil +} diff --git a/dec_skip_cases_test.go b/dec_skip_cases_test.go index 86d68d6..38fc829 100644 --- a/dec_skip_cases_test.go +++ b/dec_skip_cases_test.go @@ -22,76 +22,88 @@ var testBools = []string{ "nope", "true", "false", + " true", + " false", + "\ntrue", + "\nfalse", + "\ttrue", + "\tfalse", } var testNumbers = []string{ - "", // invalid - "0", // valid - "-", // invalid - "--", // invalid - "+", // invalid - ".", // invalid - "e", // invalid - "E", // invalid - "-.", // invalid - "-1", // valid - "--1", // invalid - "+1", // invalid - "++1", // invalid - "-a", // invalid - "-0", // valid - "00", // invalid - "01", // invalid - ".00", // invalid - "00.1", // invalid - "-00", // invalid - "-01", // invalid - "-\x00", // invalid, zero byte - "0.1", // valid - "0e1", // valid - "0e+1", // valid - "0e-1", // valid - "0e-11", // valid - "0e-1a", // invalid - "1.e1", // invalid - "0e-1+", // invalid - "0e", // invalid - "e", // invalid - "-e", // invalid - "+e", // invalid - ".e", // invalid - "e.", // invalid - "0.e", // invalid - "0-e", // invalid - "0e-", // invalid - "0e+", // invalid - "0.0e", // invalid - "0.0e1", // valid - "0.0e+", // invalid - "0.0e-", // invalid - "0e0+0", // invalid - "0.e0+0", // invalid - "0.0e+0", // valid - "0.0e+1", // valid - "0.0e0+0", // invalid - "0.", // invalid - "1.", // invalid - "0..1", // invalid, more dot - "1e+1", // valid - "1+1", // invalid - "1E1", // valid, e or E - "1ee1", // invalid - "100a", // invalid - "10.", // invalid - "-0.12", // valid - "0]", // invalid - "0e]", // invalid - "0e+]", // invalid - "1.2.3", // invalid - "0.0.0", // invalid - "9223372036854775807", // valid - "9223372036854775808", // valid - "9223372036854775807.1", // valid + "", // invalid + "0", // valid + "-", // invalid + "--", // invalid + "+", // invalid + ".", // invalid + "e", // invalid + "E", // invalid + "-.", // invalid + "-1", // valid + "--1", // invalid + "+1", // invalid + "++1", // invalid + "-a", // invalid + "-0", // valid + "00", // invalid + "01", // invalid + ".00", // invalid + "00.1", // invalid + "-00", // invalid + "-01", // invalid + "-\x00", // invalid, zero byte + "0.1", // valid + "0e1", // valid + "0e+1", // valid + "0e-1", // valid + "0e-11", // valid + "0e-1a", // invalid + "1.e1", // invalid + "0e-1+", // invalid + "0e", // invalid + "e", // invalid + "-e", // invalid + "+e", // invalid + ".e", // invalid + "e.", // invalid + "0.e", // invalid + "0-e", // invalid + "0e-", // invalid + "0e+", // invalid + "0.0e", // invalid + "0.0e1", // valid + "0.0e+", // invalid + "0.0e-", // invalid + "0e0+0", // invalid + "0.e0+0", // invalid + "0.0e+0", // valid + "0.0e+1", // valid + "0.0e0+0", // invalid + "0.", // invalid + "1.", // invalid + "0..1", // invalid, more dot + "1e+1", // valid + "1+1", // invalid + "1E1", // valid, e or E + "1ee1", // invalid + "100a", // invalid + "10.", // invalid + "-0.12", // valid + "0]", // invalid + "0e]", // invalid + "0e+]", // invalid + "1.2.3", // invalid + "0.0.0", // invalid + "9223372036854775807", // valid + "9223372036854775808", // valid + "9223372036854775807.1", // valid + " 9223372036854775807", // valid + " 9223372036854775808", // valid + " 9223372036854775807.1", // valid + "\n9223372036854775807", // valid + "\n9223372036854775808", // valid + "\n9223372036854775807.1", // valid } var testStrings = append([]string{ diff --git a/null_test.go b/null_test.go index 73bbf0a..1e08150 100644 --- a/null_test.go +++ b/null_test.go @@ -59,6 +59,10 @@ func TestNullError(t *testing.T) { if valid[i] == c { continue } + // Skip space as first character. + if i == 0 && spaceSet[c] == 1 { + continue + } b[i] = c var token badTokenErr a.ErrorAs(DecodeBytes(b[:]).Null(), &token)