feature/upgrade_filter #7
@ -41,4 +41,5 @@ const (
|
|||||||
// Date : 15:46 2024/11/29
|
// Date : 15:46 2024/11/29
|
||||||
type ExpendArrayResult struct {
|
type ExpendArrayResult struct {
|
||||||
PathList []string `json:"path_list"` // 路径列表
|
PathList []string `json:"path_list"` // 路径列表
|
||||||
|
PathMap map[string]string `json:"path_map"` // 数据源路径 => 目标路径的处理
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,9 @@ package gjson_hack
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
// newDefaultPathOption 默认路径展开选项
|
// newDefaultPathOption 默认路径展开选项
|
||||||
@ -131,22 +132,37 @@ func doExpandPath(gjsonResult gjson.Result, rootPath string, hasChildren bool, p
|
|||||||
// Author : go_developer@163.com<白茶清欢>
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
//
|
//
|
||||||
// Date : 11:13 2024/11/29
|
// Date : 11:13 2024/11/29
|
||||||
func ExpandArrayPath(jsonStr string, pathConfig string, expendArrayResult *ExpendArrayResult) error {
|
func ExpandArrayPath(jsonStr string, pathConfig string, mapConfig string, expendArrayResult *ExpendArrayResult) error {
|
||||||
if nil == expendArrayResult {
|
if nil == expendArrayResult {
|
||||||
return errors.New("expendArrayResult can not be nil")
|
return errors.New("expendArrayResult can not be nil")
|
||||||
}
|
}
|
||||||
if nil == expendArrayResult.PathList {
|
if nil == expendArrayResult.PathList {
|
||||||
expendArrayResult.PathList = make([]string, 0)
|
expendArrayResult.PathList = make([]string, 0)
|
||||||
}
|
}
|
||||||
|
if nil == expendArrayResult.PathMap {
|
||||||
|
expendArrayResult.PathMap = make(map[string]string)
|
||||||
|
}
|
||||||
|
if len(mapConfig) == 0 {
|
||||||
|
mapConfig = pathConfig
|
||||||
|
}
|
||||||
if !strings.Contains(pathConfig, ArrayIdxTpl) {
|
if !strings.Contains(pathConfig, ArrayIdxTpl) {
|
||||||
// 不是数组模板配置, 无需展开
|
// 不是数组模板配置, 无需展开
|
||||||
expendArrayResult.PathList = append(expendArrayResult.PathList, pathConfig)
|
expendArrayResult.PathList = append(expendArrayResult.PathList, pathConfig)
|
||||||
|
expendArrayResult.PathMap[pathConfig] = mapConfig
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
mapConfigArr := strings.Split(pathConfig, ArrayIdxTpl)
|
||||||
|
mapConfigArr[0] = strings.TrimSuffix(mapConfigArr[0], ".")
|
||||||
|
mapSuffixPathTpl := strings.TrimPrefix(strings.Join(mapConfigArr[1:], ArrayIdxTpl), ".")
|
||||||
|
|
||||||
pathConfigArr := strings.Split(pathConfig, ArrayIdxTpl)
|
pathConfigArr := strings.Split(pathConfig, ArrayIdxTpl)
|
||||||
pathConfigArr[0] = strings.TrimSuffix(pathConfigArr[0], ".")
|
pathConfigArr[0] = strings.TrimSuffix(pathConfigArr[0], ".")
|
||||||
suffixPathTpl := strings.TrimPrefix(strings.Join(pathConfigArr[1:], ArrayIdxTpl), ".")
|
suffixPathTpl := strings.TrimPrefix(strings.Join(pathConfigArr[1:], ArrayIdxTpl), ".")
|
||||||
|
|
||||||
|
if len(mapConfigArr) != len(pathConfigArr) {
|
||||||
|
return errors.New("mapConfig depth not equal pathConfig deep")
|
||||||
|
}
|
||||||
|
|
||||||
valueResult := gjson.Parse(jsonStr).Get(pathConfigArr[0])
|
valueResult := gjson.Parse(jsonStr).Get(pathConfigArr[0])
|
||||||
if !valueResult.Exists() {
|
if !valueResult.Exists() {
|
||||||
// 路径不存在, 无需设置具体值
|
// 路径不存在, 无需设置具体值
|
||||||
@ -155,12 +171,13 @@ func ExpandArrayPath(jsonStr string, pathConfig string, expendArrayResult *Expen
|
|||||||
if !valueResult.IsArray() {
|
if !valueResult.IsArray() {
|
||||||
// 不是数组,不要继续再向后展开了
|
// 不是数组,不要继续再向后展开了
|
||||||
expendArrayResult.PathList = append(expendArrayResult.PathList, pathConfigArr[0])
|
expendArrayResult.PathList = append(expendArrayResult.PathList, pathConfigArr[0])
|
||||||
|
expendArrayResult.PathMap[pathConfigArr[0]] = mapConfigArr[0]
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// 继续展开子项
|
// 继续展开子项
|
||||||
for idx, _ := range valueResult.Array() {
|
for idx, _ := range valueResult.Array() {
|
||||||
idxStr := fmt.Sprintf("%v", idx)
|
idxStr := fmt.Sprintf("%v", idx)
|
||||||
if err := ExpandArrayPath(jsonStr, pathConfigArr[0]+"."+idxStr+"."+suffixPathTpl, expendArrayResult); nil != err {
|
if err := ExpandArrayPath(jsonStr, pathConfigArr[0]+"."+idxStr+"."+suffixPathTpl, mapConfigArr[0]+"."+idxStr+"."+mapSuffixPathTpl, expendArrayResult); nil != err {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,9 @@ package gjson_hack
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPath(t *testing.T) {
|
func TestPath(t *testing.T) {
|
||||||
@ -163,7 +164,10 @@ func TestExpandArrayPath(t *testing.T) {
|
|||||||
byteData, _ := json.Marshal(mapData)
|
byteData, _ := json.Marshal(mapData)
|
||||||
jsonStr := string(byteData)
|
jsonStr := string(byteData)
|
||||||
// fmt.Println(jsonStr)
|
// fmt.Println(jsonStr)
|
||||||
var pathExpendRes = &ExpendArrayResult{PathList: nil}
|
var pathExpendRes = &ExpendArrayResult{
|
||||||
ExpandArrayPath(jsonStr, "user_list.{{idx}}.{{idx}}.age", pathExpendRes)
|
PathList: nil,
|
||||||
|
PathMap: nil,
|
||||||
|
}
|
||||||
|
ExpandArrayPath(jsonStr, "user_list.{{idx}}.{{idx}}.age", "", pathExpendRes)
|
||||||
fmt.Println(pathExpendRes)
|
fmt.Println(pathExpendRes)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user