Fix jsonpath to handle maps with key of nonstring types

This commit is contained in:
Avesh Agarwal 2016-03-22 17:32:40 -04:00
parent b50e89e323
commit d5e135e42c
3 changed files with 21 additions and 6 deletions

View File

@ -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)

View File

@ -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"},

View File

@ -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