diff --git a/implement/sjson_write.go b/implement/sjson_write.go index c3179ab..01e3ef4 100644 --- a/implement/sjson_write.go +++ b/implement/sjson_write.go @@ -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