升级json操作, 升级为面向接口实现 #10

Merged
zhangdeman merged 7 commits from feature/upgrade_get_set into master 2025-05-06 14:14:30 +08:00
Showing only changes of commit 47726c20b8 - Show all commits

View File

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