Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ var (
MalformedValueError = errors.New("Value looks like Number/Boolean/None, but can't find its end: ',' or '}' symbol")
OverflowIntegerError = errors.New("Value is number, but overflowed while parsing")
MalformedStringEscapeError = errors.New("Encountered an invalid escape sequence in a string")
NullValueError = errors.New("Value is null")
)

// How much stack space to allocate for unescaping JSON strings; if a string longer
Expand Down Expand Up @@ -311,7 +312,7 @@ func searchKeys(data []byte, keys ...string) int {
case '[':
// If we want to get array element by index
if keyLevel == level && keys[level][0] == '[' {
var keyLen = len(keys[level])
keyLen := len(keys[level])
if keyLen < 3 || keys[level][0] != '[' || keys[level][keyLen-1] != ']' {
return -1
}
Expand All @@ -322,7 +323,7 @@ func searchKeys(data []byte, keys ...string) int {
var curIdx int
var valueFound []byte
var valueOffset int
var curI = i
curI := i
ArrayEach(data[i:], func(value []byte, dataType ValueType, offset int, err error) {
if curIdx == aIdx {
valueFound = value
Expand Down Expand Up @@ -1191,6 +1192,9 @@ func GetString(data []byte, keys ...string) (val string, err error) {
}

if t != String {
if t == Null {
return "", NullValueError
}
return "", fmt.Errorf("Value is not a string: %s", string(v))
}

Expand All @@ -1213,6 +1217,9 @@ func GetFloat(data []byte, keys ...string) (val float64, err error) {
}

if t != Number {
if t == Null {
return 0, NullValueError
}
return 0, fmt.Errorf("Value is not a number: %s", string(v))
}

Expand All @@ -1229,6 +1236,9 @@ func GetInt(data []byte, keys ...string) (val int64, err error) {
}

if t != Number {
if t == Null {
return 0, NullValueError
}
return 0, fmt.Errorf("Value is not a number: %s", string(v))
}

Expand All @@ -1246,6 +1256,9 @@ func GetBoolean(data []byte, keys ...string) (val bool, err error) {
}

if t != Boolean {
if t == Null {
return false, NullValueError
}
return false, fmt.Errorf("Value is not a boolean: %s", string(v))
}

Expand Down
27 changes: 26 additions & 1 deletion parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -913,6 +913,12 @@ var getIntTests = []GetTest{
path: []string{"c"},
isErr: true,
},
{
desc: `null test`,
json: `{"a": "b", "c": null}`,
path: []string{"c"},
isErr: true,
},
}

var getFloatTests = []GetTest{
Expand All @@ -936,6 +942,12 @@ var getFloatTests = []GetTest{
path: []string{"c"},
isErr: true,
},
{
desc: `null test`,
json: `{"a": "b", "c": null}`,
path: []string{"c"},
isErr: true,
},
}

var getStringTests = []GetTest{
Expand Down Expand Up @@ -1006,6 +1018,12 @@ var getStringTests = []GetTest{
path: []string{"["},
isFound: false,
},
{
desc: `null test`,
json: `{"c": null}`,
path: []string{"c"},
isErr: true,
},
}

var getUnsafeStringTests = []GetTest{
Expand Down Expand Up @@ -1087,6 +1105,13 @@ var getBoolTests = []GetTest{
isFound: true,
data: true,
},
{
desc: `null test`,
json: `{"a": "b", "c": null}`,
path: []string{"c"},
isFound: false,
isErr: true,
},
}

var getArrayTests = []GetTest{
Expand Down Expand Up @@ -1408,7 +1433,7 @@ func TestArrayEach(t *testing.T) {
}

func TestArrayEachWithWhiteSpace(t *testing.T) {
//Issue #159
// Issue #159
count := 0
funcError := func([]byte, ValueType, int, error) { t.Errorf("Run func not allow") }
funcSuccess := func(value []byte, dataType ValueType, index int, err error) {
Expand Down