diff --git a/topdown/json.go b/topdown/json.go index 09a0ea6a93..d1d8897e4d 100644 --- a/topdown/json.go +++ b/topdown/json.go @@ -203,6 +203,12 @@ func pathsToObject(paths []ast.Ref) ast.Object { node := root var done bool + // If the path is an empty JSON path, skip all further processing. + if len(path) == 0 { + done = true + } + + // Otherwise, we should have 1+ path segments to work with. for i := 0; i < len(path)-1 && !done; i++ { k := path[i] diff --git a/topdown/json_test.go b/topdown/json_test.go index 53d114e4ae..f1056f0c98 100644 --- a/topdown/json_test.go +++ b/topdown/json_test.go @@ -16,6 +16,11 @@ func TestFiltersToObject(t *testing.T) { filters []string expected string }{ + { + note: "empty path", + filters: []string{`""`}, + expected: `{}`, + }, { note: "base", filters: []string{`"a/b/c"`}, @@ -81,6 +86,11 @@ func TestFiltersToObject(t *testing.T) { filters: []string{`"a/~0b~1c/d~1~0"`}, expected: `{"a": {"~b/c": {"d/~": null}}}`, }, + { + note: "empty strings mixed with normal paths", + filters: []string{`"a/b/c"`, `""`, `"a/b/d"`, `"a/e/f"`, `""`}, + expected: `{"a": {"b": {"c": null, "d": null}, "e": {"f": null}}}`, + }, } for _, tc := range cases {