完成基本的数据提取
This commit is contained in:
parent
4608f898fa
commit
89b8411fb2
@ -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
|
37
safe/data.go
37
safe/data.go
@ -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
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user