增加递归抽取不同层级的array
This commit is contained in:
		@ -8,10 +8,12 @@
 | 
				
			|||||||
package json_tool
 | 
					package json_tool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"git.zhangdeman.cn/zhangdeman/gopkg/util"
 | 
						"fmt"
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"git.zhangdeman.cn/zhangdeman/gopkg/util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/tidwall/gjson"
 | 
						"github.com/tidwall/gjson"
 | 
				
			||||||
@ -80,7 +82,7 @@ func (df *DataFilter) Filter() (string, error) {
 | 
				
			|||||||
			sourcePathArr := strings.Split(item.SourceKey, ".[].")
 | 
								sourcePathArr := strings.Split(item.SourceKey, ".[].")
 | 
				
			||||||
			mapPathArr := strings.Split(item.MapKey, ".[].")
 | 
								mapPathArr := strings.Split(item.MapKey, ".[].")
 | 
				
			||||||
			if len(sourcePathArr) != len(mapPathArr) {
 | 
								if len(sourcePathArr) != len(mapPathArr) {
 | 
				
			||||||
				return "", errors.New("slice转化原始数据深度与目标数据深度不一致")
 | 
									// return "", errors.New("slice转化原始数据深度与目标数据深度不一致")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -177,7 +179,7 @@ func (df *DataFilter) formatRule() {
 | 
				
			|||||||
					continue
 | 
										continue
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				// 数组层级深度不同,重新对对齐数据
 | 
									// 数组层级深度不同,重新对对齐数据
 | 
				
			||||||
				diffArr := sourcePathArr[0: len(sourcePathArr) - len(mapPathArr)]
 | 
									diffArr := sourcePathArr[0 : len(sourcePathArr)-len(mapPathArr)-1]
 | 
				
			||||||
				df.dealDiffArr(diffArr)
 | 
									df.dealDiffArr(diffArr)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
@ -210,13 +212,39 @@ func (df *DataFilter) dealDiffArr(diffArr []string) {
 | 
				
			|||||||
		// 已经处理过, 不再重复处理
 | 
							// 已经处理过, 不再重复处理
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	JSONObject, _ := gabs.Consume(df.source)
 | 
						if len(diffArr) == 0 {
 | 
				
			||||||
	newPath := util.GenRandomString("", 8)
 | 
							return
 | 
				
			||||||
	_, _ = JSONObject.ArrayCount()
 | 
						}
 | 
				
			||||||
	newDataList := gabs.New()
 | 
					 | 
				
			||||||
	// 没处理过, 开始处理
 | 
					 | 
				
			||||||
	for index, path := range diffArr {
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 没处理过, 开始处理
 | 
				
			||||||
 | 
						jsonResultList := df.getArrayData(df.source, diffArr)
 | 
				
			||||||
 | 
						fmt.Println(jsonResultList)
 | 
				
			||||||
 | 
						if len(jsonResultList) == 0 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	JSONObject.SetP(newPath, newDataList.String())
 | 
						newDataList := gabs.New()
 | 
				
			||||||
 | 
						newPath := util.GenRandomString("", 8)
 | 
				
			||||||
 | 
						for _, item := range jsonResultList {
 | 
				
			||||||
 | 
							newDataList.ArrayAppend(item.String())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						JSONObject, _ := gabs.Consume(df.source)
 | 
				
			||||||
 | 
						_, _ = JSONObject.SetP(newDataList.Data(), newPath)
 | 
				
			||||||
 | 
						fmt.Println(123, JSONObject.String())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// getArrayData 获取数据
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Author : go_developer@163.com<白茶清欢>
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Date : 2:22 下午 2022/1/26
 | 
				
			||||||
 | 
					func (df *DataFilter) getArrayData(source string, pathArr []string) []gjson.Result {
 | 
				
			||||||
 | 
						if len(pathArr) == 1 {
 | 
				
			||||||
 | 
							return gjson.Get(source, pathArr[0]).Array()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						resultList := make([]gjson.Result, 0)
 | 
				
			||||||
 | 
						dataList := gjson.Get(source, pathArr[0]).Array()
 | 
				
			||||||
 | 
						for idx := 0; idx < len(dataList); idx++ {
 | 
				
			||||||
 | 
							resultList = append(resultList, df.getArrayData(gjson.Get(source, dataList[idx].String()).String(), pathArr[1:])...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return resultList
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -240,3 +240,37 @@ func TestDataFilterForObiToSlice(t *testing.T) {
 | 
				
			|||||||
	filter.UserItemToSlice()
 | 
						filter.UserItemToSlice()
 | 
				
			||||||
	fmt.Println(filter.Filter())
 | 
						fmt.Println(filter.Filter())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TestDataFilterDiffArr ...
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Author : go_developer@163.com<白茶清欢>
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Date : 12:27 下午 2022/1/26
 | 
				
			||||||
 | 
					func TestDataFilterDiffArr(t *testing.T) {
 | 
				
			||||||
 | 
						source := map[string]interface{}{
 | 
				
			||||||
 | 
							"name":   "zhangdeman",
 | 
				
			||||||
 | 
							"age":    18,
 | 
				
			||||||
 | 
							"height": 180,
 | 
				
			||||||
 | 
							"extra": map[string]interface{}{
 | 
				
			||||||
 | 
								"age":    18,
 | 
				
			||||||
 | 
								"height": 180,
 | 
				
			||||||
 | 
								"slice":  []int{1, 2, 3},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"slice_data": []int{1, 2, 3},
 | 
				
			||||||
 | 
							"map":        map[string]interface{}{"a": 1, "b": 2, "c": 4},
 | 
				
			||||||
 | 
							"table": []map[string]interface{}{
 | 
				
			||||||
 | 
								{"user_list": map[string]interface{}{"name": "alex", "age": 18, "number": 1}},
 | 
				
			||||||
 | 
								{"user_list": map[string]interface{}{"name": "bob", "age": 28, "number": 2}},
 | 
				
			||||||
 | 
								{"user_list": map[string]interface{}{"name": "andy", "age": 28, "number": 2, "list": []int{1, 2, 3}}},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						rule := []*FilterDataRule{
 | 
				
			||||||
 | 
							// {SourceKey: "name", MapKey: "slice.[]", DefaultValue: "用户姓名默认值"},
 | 
				
			||||||
 | 
							{SourceKey: "table.[].user_list.[].name", MapKey: "user_list.[].detail.name", DefaultValue: "用户姓名默认值"},
 | 
				
			||||||
 | 
							{SourceKey: "table.[].user_list.[].age", MapKey: "user_list.[]detail.age", DefaultValue: "用户姓名默认值"},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						byteData, _ := json.Marshal(source)
 | 
				
			||||||
 | 
						filter := NewDataFilter(string(byteData), rule)
 | 
				
			||||||
 | 
						filter.UserItemToSlice()
 | 
				
			||||||
 | 
						fmt.Println(filter.Filter())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user