完成基本的数据提取

This commit is contained in:
白茶清欢 2021-09-10 11:36:48 +08:00
parent 4608f898fa
commit 89b8411fb2
2 changed files with 20 additions and 53 deletions

View File

@ -25,8 +25,11 @@ import (
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 10:43 下午 2021/3/14 // Date : 10:43 下午 2021/3/14
func NewParseJSONTree(data interface{}) *ParseJSONTree { func NewFilter(data interface{}, rule map[string]string) *Filter {
return &ParseJSONTree{data: data} return &Filter{
data: data,
rule: rule,
}
} }
// ParseJSONTree 解析json树 // ParseJSONTree 解析json树
@ -34,34 +37,35 @@ func NewParseJSONTree(data interface{}) *ParseJSONTree {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 10:41 下午 2021/3/14 // Date : 10:41 下午 2021/3/14
type ParseJSONTree struct { type Filter struct {
data interface{} data interface{}
rule map[string]string
} }
// Parse 解析数据 // Result 数据过滤结果
// //
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 10:44 下午 2021/3/14 // Date : 10:44 下午 2021/3/14
func (pjt *ParseJSONTree) Parse(pathList []string) (*DynamicJSON, error) { func (f *Filter) Result() (*DynamicJSON, error) {
if !pjt.isLegalData() { if !f.isLegalData() {
return nil, errors.New("非法的数据,无法转换成json") return nil, errors.New("非法的数据,无法转换成json")
} }
result := NewDynamicJSON() result := NewDynamicJSON()
byteData, _ := json.Marshal(pjt.data) byteData, _ := json.Marshal(f.data)
source := string(byteData) source := string(byteData)
for _, path := range pathList { for extraDataPath, newDataPath := range f.rule {
// 为数组的处理 // 为数组的处理
pathArr := strings.Split(path, ".[].") pathArr := strings.Split(extraDataPath, ".[].")
val := gjson.Get(source, pathArr[0]) val := gjson.Get(source, pathArr[0])
isComplexType := val.IsArray() || val.IsObject() isComplexType := val.IsArray() || val.IsObject()
if len(pathArr) == 1 { if len(pathArr) == 1 {
result.SetValue(pathArr[0], val.Raw, isComplexType) result.SetValue(newDataPath, val.Value(), isComplexType)
continue continue
} }
// 支持list再抽取一层,处于性能考虑,这么限制,不做递归无限深度处理 // 支持list再抽取一层,处于性能考虑,这么限制,不做递归无限深度处理
// 还能继续抽取,就认为是 []map[string]interface{} // 还能继续抽取,就认为是 []map[string]interface{}
ketList := strings.Split(pathArr[1], "|") ketList := strings.Split(pathArr[1], ".")
for idx, item := range val.Array() { for idx, item := range val.Array() {
data := item.Map() data := item.Map()
for _, key := range ketList { for _, key := range ketList {
@ -80,8 +84,8 @@ func (pjt *ParseJSONTree) Parse(pathList []string) (*DynamicJSON, error) {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 10:46 下午 2021/3/14 // Date : 10:46 下午 2021/3/14
func (pjt *ParseJSONTree) isLegalData() bool { func (f *Filter) isLegalData() bool {
val := reflect.ValueOf(pjt.data) val := reflect.ValueOf(f.data)
switch val.Kind() { switch val.Kind() {
case reflect.Slice: case reflect.Slice:
@ -91,9 +95,9 @@ func (pjt *ParseJSONTree) isLegalData() bool {
ok bool ok bool
err error err error
) )
if byteData, ok = pjt.data.([]byte); ok { if byteData, ok = f.data.([]byte); ok {
// 字节数组转map或者slice // 字节数组转map或者slice
if err = json.Unmarshal(byteData, &pjt.data); nil != err { if err = json.Unmarshal(byteData, &f.data); nil != err {
return false return false
} }
return true return true
@ -107,7 +111,7 @@ func (pjt *ParseJSONTree) isLegalData() bool {
case reflect.Ptr: case reflect.Ptr:
// 指针 // 指针
var err error var err error
if pjt.data, err = util.StructToMap(pjt.data); nil != err { if f.data, err = util.StructToMap(f.data); nil != err {
return false return false
} }
return true return true

View File

@ -1,37 +0,0 @@
// Package safe ...
//
// Description : 按需返回对外暴露的字段
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-03-10 6:38 下午
package safe
import (
"strings"
"github.com/buger/jsonparser"
)
// Filter 按需输出数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 6:40 下午 2021/3/10
func Filter(source []byte, filter map[string]string) ([]byte, error) {
var (
bt []byte
setErr error
)
for result, item := range filter {
fieldList := strings.Split(item, ".")
val, _, _, err := jsonparser.Get(source, fieldList...)
if nil != err {
return nil, err
}
if bt, setErr = jsonparser.Set(bt, val, strings.Split(result, ".")...); nil != setErr {
return nil, setErr
}
}
return bt, nil
}