From 47726c20b8287283c0e053f09ba68453ceb42b1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Tue, 6 May 2025 12:39:48 +0800 Subject: [PATCH] =?UTF-8?q?SJsonWrite=E8=AE=BE=E7=BD=AE=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=97=B6,=20=E6=94=AF=E6=8C=81=E5=81=9Amap=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- implement/sjson_write.go | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) 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