升级json操作, 升级为面向接口实现 #10
@ -8,9 +8,11 @@
|
||||
package implement
|
||||
|
||||
import (
|
||||
"git.zhangdeman.cn/zhangdeman/consts"
|
||||
"git.zhangdeman.cn/zhangdeman/json_filter/abstract"
|
||||
"git.zhangdeman.cn/zhangdeman/serialize"
|
||||
"github.com/tidwall/sjson"
|
||||
"reflect"
|
||||
"sync"
|
||||
)
|
||||
|
||||
@ -33,7 +35,45 @@ func (s *SjsonWrite) Set(dataPath string, data any) error {
|
||||
|
||||
s.l.Lock()
|
||||
defer s.l.Unlock()
|
||||
if s.res, err = sjson.Set(s.res, dataPath, data); nil != err {
|
||||
existResRead := NewGjsonRead(s.res)
|
||||
if !existResRead.Exist(dataPath) || data == nil {
|
||||
// 路径不存在
|
||||
if s.res, err = sjson.Set(s.res, dataPath, data); nil != err {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// 路径已存在, 判断是否为map
|
||||
if existResRead.Type(dataPath) != consts.DataTypeMapStrAny.String() {
|
||||
if s.res, err = sjson.Set(s.res, dataPath, data); nil != err {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// 判断data是否为map
|
||||
dataType := reflect.TypeOf(data)
|
||||
if dataType.Kind() == reflect.Ptr {
|
||||
dataType = dataType.Elem()
|
||||
}
|
||||
if dataType.Kind() != reflect.Struct && dataType.Kind() != reflect.Map {
|
||||
// 既不是map, 也不是struct
|
||||
if s.res, err = sjson.Set(s.res, dataPath, data); nil != err {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// 路径已存在, 已存在数据为map, 且要设置的数据也为map, 进行数据合并
|
||||
mergeDataMap := map[string]any{}
|
||||
existMapVal := map[string]any{}
|
||||
|
||||
if existMapVal, err = existResRead.Map(dataPath); nil != err {
|
||||
return err
|
||||
}
|
||||
// 合并输入数据
|
||||
if err = serialize.JSON.MergeDataForReceiver(&mergeDataMap, existMapVal, data); nil != err {
|
||||
return err
|
||||
}
|
||||
if s.res, err = sjson.Set(s.res, dataPath, mergeDataMap); nil != err {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
Loading…
x
Reference in New Issue
Block a user