فهرست منبع

object lazy any support get all

Tao Wen 8 سال پیش
والد
کامیت
bf459b9a49
3فایلهای تغییر یافته به همراه35 افزوده شده و 13 حذف شده
  1. 5 5
      feature_any_array.go
  2. 23 8
      feature_any_object.go
  3. 7 0
      jsoniter_object_test.go

+ 5 - 5
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)}
 		}

+ 23 - 8
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 {

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