Skip to content

Commit b8cfd99

Browse files
committed
fix #79 - allow empty array on ArrayEach()
1 parent 8d54c8a commit b8cfd99

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

parser.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,17 @@ func ArrayEach(data []byte, cb func(value []byte, dataType ValueType, offset int
571571
offset++
572572
}
573573

574+
nO := nextToken(data[offset:])
575+
if nO == -1 {
576+
return offset, MalformedJsonError
577+
}
578+
579+
offset += nO
580+
581+
if data[offset] == ']' {
582+
return offset, nil
583+
}
584+
574585
for true {
575586
v, t, o, e := Get(data[offset:])
576587

parser_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,41 @@ func TestArrayEach(t *testing.T) {
752752
}, "a", "b")
753753
}
754754

755+
func TestArrayEachEmpty(t *testing.T) {
756+
funcError := func([]byte, ValueType, int, error) { t.Errorf("Run func not allow") }
757+
758+
type args struct {
759+
data []byte
760+
cb func(value []byte, dataType ValueType, offset int, err error)
761+
keys []string
762+
}
763+
tests := []struct {
764+
name string
765+
args args
766+
wantOffset int
767+
wantErr bool
768+
}{
769+
{"Empty array", args{[]byte("[]"), funcError, []string{}}, 1, false},
770+
{"Empty array with space", args{[]byte("[ ]"), funcError, []string{}}, 2, false},
771+
{"Empty array with \n", args{[]byte("[\n]"), funcError, []string{}}, 2, false},
772+
{"Empty field array", args{[]byte("{\"data\": []}"), funcError, []string{"data"}}, 10, false},
773+
{"Empty field array with space", args{[]byte("{\"data\": [ ]}"), funcError, []string{"data"}}, 11, false},
774+
{"Empty field array with \n", args{[]byte("{\"data\": [\n]}"), funcError, []string{"data"}}, 11, false},
775+
}
776+
for _, tt := range tests {
777+
t.Run(tt.name, func(t *testing.T) {
778+
gotOffset, err := ArrayEach(tt.args.data, tt.args.cb, tt.args.keys...)
779+
if (err != nil) != tt.wantErr {
780+
t.Errorf("ArrayEach() error = %v, wantErr %v", err, tt.wantErr)
781+
return
782+
}
783+
if gotOffset != tt.wantOffset {
784+
t.Errorf("ArrayEach() = %v, want %v", gotOffset, tt.wantOffset)
785+
}
786+
})
787+
}
788+
}
789+
755790
type keyValueEntry struct {
756791
key string
757792
value string

0 commit comments

Comments
 (0)