1
0
mirror of https://github.com/json-iterator/go.git synced 2025-02-01 19:14:29 +02:00

object lazy any support get all

This commit is contained in:
Tao Wen 2017-01-31 20:26:35 +08:00
parent 498ab96d90
commit bf459b9a49
3 changed files with 35 additions and 13 deletions

View File

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

View File

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

View File

@ -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(`{}`)