修复不同层级数组数据对齐的BUG

This commit is contained in:
白茶清欢 2022-01-27 12:06:24 +08:00
parent 632ef3ed7f
commit 19813fa9ee

View File

@ -76,17 +76,6 @@ func (df *DataFilter) Filter() (string, error) {
// 创建数据的根结点 // 创建数据的根结点
jsonObject = gabs.New() jsonObject = gabs.New()
for _, item := range df.filterRule { for _, item := range df.filterRule {
if df.pathIsArrayValue(item.SourceKey) {
// 数组, 特殊处理
// 0. 判断目标路径是否为数组
// 1. 判断数据源数组深度与目标数组深度是否一致
sourcePathArr := strings.Split(item.SourceKey, ".[].")
mapPathArr := strings.Split(item.MapKey, ".[].")
if len(sourcePathArr) != len(mapPathArr) {
// return "", errors.New("slice转化原始数据深度与目标数据深度不一致")
}
continue
}
// 数据源路径不识数组, 多个key写入到同一个map key, 并且map key 不是以[]结尾, 自动格式化 // 数据源路径不识数组, 多个key写入到同一个map key, 并且map key 不是以[]结尾, 自动格式化
// 目标位置, 是一个数组 // 目标位置, 是一个数组
if df.pathIsArrayValue(item.MapKey) { if df.pathIsArrayValue(item.MapKey) {
@ -180,8 +169,11 @@ func (df *DataFilter) formatRule() {
continue continue
} }
// 数组层级深度不同,重新对对齐数据 // 数组层级深度不同,重新对对齐数据
diffArr := sourcePathArr[0 : len(sourcePathArr)-len(mapPathArr)-1] diffArr := sourcePathArr[0 : len(sourcePathArr)-len(mapPathArr)+1]
df.dealDiffArr(diffArr) if newPath := df.dealDiffArr(diffArr); len(newPath) > 0 {
sourcePathArr[len(sourcePathArr)-len(mapPathArr)] = newPath
item.SourceKey = strings.Join(sourcePathArr[len(sourcePathArr)-len(mapPathArr):], ".[].")
}
} }
} else { } else {
if df.pathIsArrayValue(item.MapKey) { if df.pathIsArrayValue(item.MapKey) {
@ -207,20 +199,21 @@ func (df *DataFilter) formatRule() {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 5:04 下午 2022/1/25 // Date : 5:04 下午 2022/1/25
func (df *DataFilter) dealDiffArr(diffArr []string) { func (df *DataFilter) dealDiffArr(diffArr []string) string {
if len(diffArr) == 0 {
return ""
}
diffArrStr := strings.Join(diffArr, ".[].") diffArrStr := strings.Join(diffArr, ".[].")
if _, exist := df.hasDealDiffPath[diffArrStr]; exist { if _, exist := df.hasDealDiffPath[diffArrStr]; exist {
// 已经处理过, 不再重复处理 // 已经处理过, 不再重复处理
return return df.hasDealDiffPath[diffArrStr]
}
if len(diffArr) == 0 {
return
} }
// 没处理过, 开始处理 // 没处理过, 开始处理
jsonResultList := df.getArrayData(df.source, diffArr) jsonResultList := df.getArrayData(df.source, diffArr)
if len(jsonResultList) == 0 { if len(jsonResultList) == 0 {
return return ""
} }
newPath := util.GenRandomString("", 8) newPath := util.GenRandomString("", 8)
var result map[string]interface{} var result map[string]interface{}
@ -234,6 +227,8 @@ func (df *DataFilter) dealDiffArr(diffArr []string) {
} }
df.source = JSONObject.String() df.source = JSONObject.String()
df.hasDealDiffPath[diffArrStr] = newPath
return newPath
} }
// getArrayData 获取数据 // getArrayData 获取数据
@ -248,7 +243,8 @@ func (df *DataFilter) getArrayData(source string, pathArr []string) []gjson.Resu
resultList := make([]gjson.Result, 0) resultList := make([]gjson.Result, 0)
dataList := gjson.Get(source, pathArr[0]).Array() dataList := gjson.Get(source, pathArr[0]).Array()
for idx := 0; idx < len(dataList); idx++ { for idx := 0; idx < len(dataList); idx++ {
resultList = append(resultList, df.getArrayData(gjson.Get(source, dataList[idx].String()).String(), pathArr[1:])...) // sourceData := gjson.Get(source, dataList[idx].String()).String()
resultList = append(resultList, df.getArrayData(dataList[idx].String(), pathArr[1:])...)
} }
return resultList return resultList
} }