diff --git a/pkg/util/jsonpath/jsonpath.go b/pkg/util/jsonpath/jsonpath.go index 35fcdd92d7a..7a402af49b1 100644 --- a/pkg/util/jsonpath/jsonpath.go +++ b/pkg/util/jsonpath/jsonpath.go @@ -325,7 +325,13 @@ func (j *JSONPath) evalField(input []reflect.Value, node *FieldNode) ([]reflect. return nil, err } } else if value.Kind() == reflect.Map { - result = value.MapIndex(reflect.ValueOf(node.Value)) + mapKeyType := value.Type().Key() + nodeValue := reflect.ValueOf(node.Value) + // node value type must be convertible to map key type + if !nodeValue.Type().ConvertibleTo(mapKeyType) { + return results, fmt.Errorf("%s is not convertible to %s", nodeValue, mapKeyType) + } + result = value.MapIndex(nodeValue.Convert(mapKeyType)) } if result.IsValid() { results = append(results, result) diff --git a/pkg/util/jsonpath/jsonpath_test.go b/pkg/util/jsonpath/jsonpath_test.go index 01f07c908bb..e01a9a4588f 100644 --- a/pkg/util/jsonpath/jsonpath_test.go +++ b/pkg/util/jsonpath/jsonpath_test.go @@ -114,11 +114,14 @@ type bicycle struct { Price float32 } +type empName string +type job string type store struct { - Book []book - Bicycle bicycle - Name string - Labels map[string]int + Book []book + Bicycle bicycle + Name string + Labels map[string]int + Employees map[empName]job } func TestStructInput(t *testing.T) { @@ -136,6 +139,10 @@ func TestStructInput(t *testing.T) { "web/html": 15, "k8s-app": 20, }, + Employees: map[empName]job{ + "jason": "manager", + "dan": "clerk", + }, } storeTests := []jsonpathTest{ @@ -147,6 +154,8 @@ func TestStructInput(t *testing.T) { {"array", "{[0:2]}", []string{"Monday", "Tudesday"}, "Monday Tudesday"}, {"variable", "hello {.Name}", storeData, "hello jsonpath"}, {"dict/", "{$.Labels.web/html}", storeData, "15"}, + {"dict/", "{$.Employees.jason}", storeData, "manager"}, + {"dict/", "{$.Employees.dan}", storeData, "clerk"}, {"dict-", "{.Labels.k8s-app}", storeData, "20"}, {"nest", "{.Bicycle.Color}", storeData, "red"}, {"allarray", "{.Book[*].Author}", storeData, "Nigel Rees Evelyn Waugh Herman Melville"}, diff --git a/pkg/util/jsonpath/node.go b/pkg/util/jsonpath/node.go index 9d5242de7bf..ddf015c049a 100644 --- a/pkg/util/jsonpath/node.go +++ b/pkg/util/jsonpath/node.go @@ -95,7 +95,7 @@ func (t *TextNode) String() string { return fmt.Sprintf("%s: %s", t.Type(), t.Text) } -// FieldNode holds filed of struct +// FieldNode holds field of struct type FieldNode struct { NodeType Value string