mirror of
https://github.com/json-iterator/go.git
synced 2025-04-20 11:28:49 +02:00
object lazy any support get all
This commit is contained in:
parent
498ab96d90
commit
bf459b9a49
@ -468,14 +468,14 @@ func (any *arrayAny) Get(path ...interface{}) Any {
|
|||||||
case int32:
|
case int32:
|
||||||
if '*' == firstPath {
|
if '*' == firstPath {
|
||||||
any.fillCache()
|
any.fillCache()
|
||||||
arr := make([]Any, 0, len(any.cache))
|
mappedAll := make([]Any, 0, len(any.cache))
|
||||||
for _, element := range any.cache {
|
for _, element := range any.cache {
|
||||||
found := element.Get(path[1:]...)
|
mapped := element.Get(path[1:]...)
|
||||||
if found.ValueType() != Invalid {
|
if mapped.ValueType() != Invalid {
|
||||||
arr = append(arr, found)
|
mappedAll = append(mappedAll, mapped)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return wrapArray(arr)
|
return wrapArray(mappedAll)
|
||||||
} else {
|
} else {
|
||||||
element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", path[0], any.cache)}
|
element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", path[0], any.cache)}
|
||||||
}
|
}
|
||||||
|
@ -215,14 +215,29 @@ func (any *objectLazyAny) Get(path ...interface{}) Any {
|
|||||||
return any
|
return any
|
||||||
}
|
}
|
||||||
var element Any
|
var element Any
|
||||||
key, ok := path[0].(string)
|
|
||||||
if ok {
|
switch firstPath := path[0].(type) {
|
||||||
element = any.fillCacheUntil(key)
|
case string:
|
||||||
|
element = any.fillCacheUntil(firstPath)
|
||||||
if element == nil {
|
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 {
|
case int32:
|
||||||
element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)}
|
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 {
|
if len(path) == 1 {
|
||||||
return element
|
return element
|
||||||
@ -472,7 +487,7 @@ func (any *objectAny) ToFloat64() float64 {
|
|||||||
|
|
||||||
func (any *objectAny) ToString() string {
|
func (any *objectAny) ToString() string {
|
||||||
if len(any.cache) == 0 {
|
if len(any.cache) == 0 {
|
||||||
str, err := MarshalToString(any.val)
|
str, err := MarshalToString(any.val.Interface())
|
||||||
any.err = err
|
any.err = err
|
||||||
return str
|
return str
|
||||||
} else {
|
} else {
|
||||||
@ -707,7 +722,7 @@ func (any *mapAny) ToFloat64() float64 {
|
|||||||
|
|
||||||
func (any *mapAny) ToString() string {
|
func (any *mapAny) ToString() string {
|
||||||
if len(any.cache) == 0 {
|
if len(any.cache) == 0 {
|
||||||
str, err := MarshalToString(any.val)
|
str, err := MarshalToString(any.val.Interface())
|
||||||
any.err = err
|
any.err = err
|
||||||
return str
|
return str
|
||||||
} else {
|
} else {
|
||||||
|
@ -147,6 +147,13 @@ func Test_object_lazy_any_get(t *testing.T) {
|
|||||||
should.Equal("d", any.Get("a", "b", "c").ToString())
|
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) {
|
func Test_object_lazy_any_get_invalid(t *testing.T) {
|
||||||
should := require.New(t)
|
should := require.New(t)
|
||||||
any, err := UnmarshalAnyFromString(`{}`)
|
any, err := UnmarshalAnyFromString(`{}`)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user