修复raw异常 #13
@ -20,12 +20,23 @@ import (
|
|||||||
"git.zhangdeman.cn/zhangdeman/gopkg/util"
|
"git.zhangdeman.cn/zhangdeman/gopkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// MapDataRule 数据映射结果
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:09 PM 2022/1/17
|
||||||
|
type MapDataRule struct {
|
||||||
|
MapKey string
|
||||||
|
DefaultValue string
|
||||||
|
IsComplexType bool
|
||||||
|
}
|
||||||
|
|
||||||
// NewFilter 获取解析的实例
|
// NewFilter 获取解析的实例
|
||||||
//
|
//
|
||||||
// Author : go_developer@163.com<白茶清欢>
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
//
|
//
|
||||||
// Date : 10:43 下午 2021/3/14
|
// Date : 10:43 下午 2021/3/14
|
||||||
func NewFilter(data interface{}, rule map[string]string) *Filter {
|
func NewFilter(data interface{}, rule map[string]MapDataRule) *Filter {
|
||||||
return &Filter{
|
return &Filter{
|
||||||
data: data,
|
data: data,
|
||||||
rule: rule,
|
rule: rule,
|
||||||
@ -39,7 +50,7 @@ func NewFilter(data interface{}, rule map[string]string) *Filter {
|
|||||||
// Date : 10:41 下午 2021/3/14
|
// Date : 10:41 下午 2021/3/14
|
||||||
type Filter struct {
|
type Filter struct {
|
||||||
data interface{}
|
data interface{}
|
||||||
rule map[string]string
|
rule map[string]MapDataRule
|
||||||
}
|
}
|
||||||
|
|
||||||
// Result 数据过滤结果
|
// Result 数据过滤结果
|
||||||
@ -54,12 +65,12 @@ func (f *Filter) Result() (*DynamicJSON, error) {
|
|||||||
result := NewDynamicJSON()
|
result := NewDynamicJSON()
|
||||||
byteData, _ := json.Marshal(f.data)
|
byteData, _ := json.Marshal(f.data)
|
||||||
source := string(byteData)
|
source := string(byteData)
|
||||||
for extraDataPath, newDataPath := range f.rule {
|
for extraDataPath, newDataRule := range f.rule {
|
||||||
// 为数组的处理
|
// 为数组的处理
|
||||||
pathArr := strings.Split(extraDataPath, ".[].")
|
pathArr := strings.Split(extraDataPath, ".[].")
|
||||||
val := gjson.Get(source, pathArr[0])
|
val := gjson.Get(source, pathArr[0])
|
||||||
if len(pathArr) == 1 {
|
if len(pathArr) == 1 {
|
||||||
f.SetValue(result, newDataPath, val.Value(), false, 0)
|
f.SetValue(result, newDataRule.MapKey, val.Value(), false, 0)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// 支持list再抽取一层,处于性能考虑,这么限制,不做递归无限深度处理
|
// 支持list再抽取一层,处于性能考虑,这么限制,不做递归无限深度处理
|
||||||
@ -69,9 +80,11 @@ func (f *Filter) Result() (*DynamicJSON, error) {
|
|||||||
data := item.Map()
|
data := item.Map()
|
||||||
for _, key := range ketList {
|
for _, key := range ketList {
|
||||||
if v, exist := data[key]; exist {
|
if v, exist := data[key]; exist {
|
||||||
result.SetValue(strings.ReplaceAll(newDataPath, "[]", fmt.Sprintf("[%d]", idx)), data[key].Raw, v.IsObject() || v.IsArray())
|
result.SetValue(strings.ReplaceAll(newDataRule.MapKey, "[]", fmt.Sprintf("[%d]", idx)), data[key].Value(), v.IsObject() || v.IsArray())
|
||||||
|
} else {
|
||||||
|
// 结果集中不存在对应key,设置默认值
|
||||||
|
result.SetValue(strings.ReplaceAll(newDataRule.MapKey, "[]", fmt.Sprintf("[%d]", idx)), newDataRule.DefaultValue, newDataRule.IsComplexType)
|
||||||
}
|
}
|
||||||
// 结果集中不存在对应key,丢弃
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,13 +69,19 @@ func TestSelect(t *testing.T) {
|
|||||||
"table": []map[string]interface{}{
|
"table": []map[string]interface{}{
|
||||||
{"name": "alex", "age": 18, "number": 1},
|
{"name": "alex", "age": 18, "number": 1},
|
||||||
{"name": "bob", "age": 28, "number": 2},
|
{"name": "bob", "age": 28, "number": 2},
|
||||||
|
{"name": "bob", "age": 28, "number": 2, "list": []int{1, 2, 3}},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
rule := map[string]string{
|
rule := map[string]MapDataRule{
|
||||||
"name": "user_name",
|
"name": {
|
||||||
"extra.age": "user_age",
|
MapKey: "user_name",
|
||||||
"extra.height": "user_height",
|
DefaultValue: "用户姓名默认值",
|
||||||
"table.[].name": "slice.[].name",
|
IsComplexType: false,
|
||||||
|
},
|
||||||
|
"extra.age": {MapKey: "user_age", DefaultValue: "用户年龄默认值", IsComplexType: false},
|
||||||
|
"extra.height": {MapKey: "user_height", DefaultValue: "扩展高度默认值", IsComplexType: false},
|
||||||
|
"table.[].name": {MapKey: "slice.[].name_modify", DefaultValue: "列表姓名默认值", IsComplexType: false},
|
||||||
|
"table.[].list": {MapKey: "slice.[].data_list", DefaultValue: "[\"567\",\"678\",\"789\"]", IsComplexType: true},
|
||||||
}
|
}
|
||||||
filter := NewFilter(source, rule)
|
filter := NewFilter(source, rule)
|
||||||
d, e := filter.Result()
|
d, e := filter.Result()
|
||||||
|
Loading…
Reference in New Issue
Block a user