diff --git a/filter/impl/generic_filter.go b/filter/impl/generic_filter.go
index 1ec4b99b823b8e514712b5ab3587c37513be24c0..f65e51ddddafc7acdf4e2c68411313dcec9ae08e 100644
--- a/filter/impl/generic_filter.go
+++ b/filter/impl/generic_filter.go
@@ -85,17 +85,15 @@ func struct2MapAll(obj interface{}) interface{} {
 		for i := 0; i < t.NumField(); i++ {
 			if v.Field(i).Kind() == reflect.Struct {
 				if v.Field(i).CanInterface() {
-					result[headerAtoa(t.Field(i).Name)] = struct2MapAll(v.Field(i).Interface())
+					setInMap(result, t.Field(i), struct2MapAll(v.Field(i).Interface()))
 				}
 			} else if v.Field(i).Kind() == reflect.Slice {
-				result[headerAtoa(t.Field(i).Name)] = struct2MapAll(v.Field(i).Interface())
+				if v.Field(i).CanInterface() {
+					setInMap(result, t.Field(i), struct2MapAll(v.Field(i).Interface()))
+				}
 			} else {
 				if v.Field(i).CanInterface() {
-					if tagName := t.Field(i).Tag.Get("m"); tagName == "" {
-						result[headerAtoa(t.Field(i).Name)] = v.Field(i).Interface()
-					} else {
-						result[tagName] = v.Field(i).Interface()
-					}
+					setInMap(result, t.Field(i), v.Field(i).Interface())
 				}
 			}
 		}
@@ -112,6 +110,15 @@ func struct2MapAll(obj interface{}) interface{} {
 		return obj
 	}
 }
+func setInMap(m map[string]interface{}, structField reflect.StructField, value interface{}) (result map[string]interface{}) {
+	result = m
+	if tagName := structField.Tag.Get("m"); tagName == "" {
+		result[headerAtoa(structField.Name)] = value
+	} else {
+		result[tagName] = value
+	}
+	return
+}
 func headerAtoa(a string) (b string) {
 	b = strings.ToLower(a[:1]) + a[1:]
 	return