mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
Fix jsonpath to handle maps with key of nonstring types
This commit is contained in:
parent
b50e89e323
commit
d5e135e42c
@ -325,7 +325,13 @@ func (j *JSONPath) evalField(input []reflect.Value, node *FieldNode) ([]reflect.
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else if value.Kind() == reflect.Map {
|
} 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() {
|
if result.IsValid() {
|
||||||
results = append(results, result)
|
results = append(results, result)
|
||||||
|
@ -114,11 +114,14 @@ type bicycle struct {
|
|||||||
Price float32
|
Price float32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type empName string
|
||||||
|
type job string
|
||||||
type store struct {
|
type store struct {
|
||||||
Book []book
|
Book []book
|
||||||
Bicycle bicycle
|
Bicycle bicycle
|
||||||
Name string
|
Name string
|
||||||
Labels map[string]int
|
Labels map[string]int
|
||||||
|
Employees map[empName]job
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStructInput(t *testing.T) {
|
func TestStructInput(t *testing.T) {
|
||||||
@ -136,6 +139,10 @@ func TestStructInput(t *testing.T) {
|
|||||||
"web/html": 15,
|
"web/html": 15,
|
||||||
"k8s-app": 20,
|
"k8s-app": 20,
|
||||||
},
|
},
|
||||||
|
Employees: map[empName]job{
|
||||||
|
"jason": "manager",
|
||||||
|
"dan": "clerk",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
storeTests := []jsonpathTest{
|
storeTests := []jsonpathTest{
|
||||||
@ -147,6 +154,8 @@ func TestStructInput(t *testing.T) {
|
|||||||
{"array", "{[0:2]}", []string{"Monday", "Tudesday"}, "Monday Tudesday"},
|
{"array", "{[0:2]}", []string{"Monday", "Tudesday"}, "Monday Tudesday"},
|
||||||
{"variable", "hello {.Name}", storeData, "hello jsonpath"},
|
{"variable", "hello {.Name}", storeData, "hello jsonpath"},
|
||||||
{"dict/", "{$.Labels.web/html}", storeData, "15"},
|
{"dict/", "{$.Labels.web/html}", storeData, "15"},
|
||||||
|
{"dict/", "{$.Employees.jason}", storeData, "manager"},
|
||||||
|
{"dict/", "{$.Employees.dan}", storeData, "clerk"},
|
||||||
{"dict-", "{.Labels.k8s-app}", storeData, "20"},
|
{"dict-", "{.Labels.k8s-app}", storeData, "20"},
|
||||||
{"nest", "{.Bicycle.Color}", storeData, "red"},
|
{"nest", "{.Bicycle.Color}", storeData, "red"},
|
||||||
{"allarray", "{.Book[*].Author}", storeData, "Nigel Rees Evelyn Waugh Herman Melville"},
|
{"allarray", "{.Book[*].Author}", storeData, "Nigel Rees Evelyn Waugh Herman Melville"},
|
||||||
|
@ -95,7 +95,7 @@ func (t *TextNode) String() string {
|
|||||||
return fmt.Sprintf("%s: %s", t.Type(), t.Text)
|
return fmt.Sprintf("%s: %s", t.Type(), t.Text)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FieldNode holds filed of struct
|
// FieldNode holds field of struct
|
||||||
type FieldNode struct {
|
type FieldNode struct {
|
||||||
NodeType
|
NodeType
|
||||||
Value string
|
Value string
|
||||||
|
Loading…
Reference in New Issue
Block a user