修复raw异常 #13

Merged
zhangdeman merged 1 commits from feature/json into master 2022-01-17 18:11:06 +08:00
2 changed files with 30 additions and 11 deletions

View File

@ -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,丢弃
} }
} }
} }

View File

@ -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()