SJsonWrite设置数据时, 支持做map合并

This commit is contained in:
白茶清欢 2025-05-06 12:39:48 +08:00
parent 042aad254b
commit 47726c20b8

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