@@ -202,22 +202,23 @@ func diff(diffs *diffs, path string, source, patch *JsonNode, option JsonDiffOpt
202202 }
203203}
204204
205- func getDiff (source , patch []byte , options ... JsonDiffOption ) * JsonNode {
206- sourceJsonNode := Unmarshal (source )
207- patchJsonNode := Unmarshal (patch )
208- option := JsonDiffOption (0 )
209- for _ , o := range options {
210- option |= o
211- }
212- diffs := newDiffs ()
213- diff (diffs , "" , sourceJsonNode , patchJsonNode , option )
214- doOption (diffs , option , sourceJsonNode , patchJsonNode )
215- return diffs .d
205+ // GetDiffNode 比较两个 JsonNode 之间的差异,并返回 JsonNode 格式的差异结果
206+ func GetDiffNode (sourceJsonNode , patchJsonNode * JsonNode , options ... JsonDiffOption ) * JsonNode {
207+ option := JsonDiffOption (0 )
208+ for _ , o := range options {
209+ option |= o
210+ }
211+ diffs := newDiffs ()
212+ diff (diffs , "" , sourceJsonNode , patchJsonNode , option )
213+ doOption (diffs , option , sourceJsonNode , patchJsonNode )
214+ return diffs .d
216215}
217216
218217// AsDiffs 比较 patch 相比于 source 的差别,返回 json 格式的差异文档。
219218func AsDiffs (source , patch []byte , options ... JsonDiffOption ) ([]byte , error ) {
220- dict := marshalSlice (getDiff (source , patch , options ... ))
219+ sourceJsonNode := Unmarshal (source )
220+ patchJsonNode := Unmarshal (patch )
221+ dict := marshalSlice (GetDiffNode (sourceJsonNode , patchJsonNode , options ... ))
221222 return json .Marshal (dict )
222223}
223224
@@ -315,26 +316,32 @@ func mergeTest(srcNode *JsonNode, path string, value *JsonNode) error {
315316// 根据差异文档 diff 还原 source 的差异
316317func MergeDiff (source , diff []byte ) ([]byte , error ) {
317318 diffNode := Unmarshal (diff )
318- if diffNode == nil {
319- return nil , nil
320- }
321- if diffNode .Type != JsonNodeTypeSlice {
322- return nil , errors .New ("DabDiff" )
323- }
324319 srcNode := Unmarshal (source )
325-
326- // guarantee atomicity
327- copyNode := new (JsonNode )
328- err := DeepCopy (copyNode , srcNode )
320+ result , err := MergeDiffNode (srcNode , diffNode )
329321 if err != nil {
330- return nil , err
331- }
332- err = merge (copyNode , diffNode )
333- if err != nil {
334- return nil , err
335- }
336- srcNode = copyNode
337- return Marshal (srcNode )
322+ return nil , err
323+ }
324+ return Marshal (result )
325+ }
326+
327+ func MergeDiffNode (source , diffs * JsonNode ) (* JsonNode , error ) {
328+ if diffs == nil {
329+ return source , nil
330+ }
331+ if diffs .Type != JsonNodeTypeSlice {
332+ return nil , errors .New ("DabDiff" )
333+ }
334+ copyNode := new (JsonNode )
335+ err := DeepCopy (copyNode , source )
336+ if err != nil {
337+ return nil , err
338+ }
339+ err = merge (copyNode , diffs )
340+ if err != nil {
341+ return nil , err
342+ }
343+ source = copyNode
344+ return source , nil
338345}
339346
340347func beautifyJsonString (data []byte ) {
0 commit comments