diff --git a/feature_any_array.go b/feature_any_array.go index e08d159..8e8ff31 100644 --- a/feature_any_array.go +++ b/feature_any_array.go @@ -468,14 +468,14 @@ func (any *arrayAny) Get(path ...interface{}) Any { case int32: if '*' == firstPath { any.fillCache() - arr := make([]Any, 0, len(any.cache)) + mappedAll := make([]Any, 0, len(any.cache)) for _, element := range any.cache { - found := element.Get(path[1:]...) - if found.ValueType() != Invalid { - arr = append(arr, found) + mapped := element.Get(path[1:]...) + if mapped.ValueType() != Invalid { + mappedAll = append(mappedAll, mapped) } } - return wrapArray(arr) + return wrapArray(mappedAll) } else { element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", path[0], any.cache)} } diff --git a/feature_any_object.go b/feature_any_object.go index 3aa8fd7..650f10f 100644 --- a/feature_any_object.go +++ b/feature_any_object.go @@ -215,14 +215,29 @@ func (any *objectLazyAny) Get(path ...interface{}) Any { return any } var element Any - key, ok := path[0].(string) - if ok { - element = any.fillCacheUntil(key) + + switch firstPath := path[0].(type) { + case string: + element = any.fillCacheUntil(firstPath) if element == nil { - element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)} + element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)} } - } else { - element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)} + case int32: + if '*' == firstPath { + any.fillCache() + mappedAll := map[string]Any{} + for key, value := range any.cache { + mapped := value.Get(path[1:]...) + if mapped.ValueType() != Invalid { + mappedAll[key] = mapped + } + } + return wrapMap(mappedAll) + } else { + element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)} + } + default: + element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", firstPath, any.cache)} } if len(path) == 1 { return element @@ -472,7 +487,7 @@ func (any *objectAny) ToFloat64() float64 { func (any *objectAny) ToString() string { if len(any.cache) == 0 { - str, err := MarshalToString(any.val) + str, err := MarshalToString(any.val.Interface()) any.err = err return str } else { @@ -707,7 +722,7 @@ func (any *mapAny) ToFloat64() float64 { func (any *mapAny) ToString() string { if len(any.cache) == 0 { - str, err := MarshalToString(any.val) + str, err := MarshalToString(any.val.Interface()) any.err = err return str } else { diff --git a/jsoniter_object_test.go b/jsoniter_object_test.go index e17e9fb..c3c8e86 100644 --- a/jsoniter_object_test.go +++ b/jsoniter_object_test.go @@ -147,6 +147,13 @@ func Test_object_lazy_any_get(t *testing.T) { should.Equal("d", any.Get("a", "b", "c").ToString()) } +func Test_object_lazy_any_get_all(t *testing.T) { + should := require.New(t) + any, err := UnmarshalAnyFromString(`{"a":[0],"b":[1]}`) + should.Nil(err) + should.Equal(`{"a":0,"b":1}`, any.Get('*', 0).ToString()) +} + func Test_object_lazy_any_get_invalid(t *testing.T) { should := require.New(t) any, err := UnmarshalAnyFromString(`{}`)