@@ -379,26 +379,29 @@ func MergeObject(template, parent *JsonObject, keepOverrides bool, path string)
379379 if keepOverrides {
380380 result .Put (key , value )
381381 } else {
382- childPath := ""
383382 switch typed := value .(type ) {
384383 case * JsonObject :
385384 childCapacity := 0
386385 if typed != nil {
387386 childCapacity = typed .Size ()
388387 }
389- if typed != nil {
390- childPath = joinObjectPath (path , key )
388+ if typed != nil && objectNeedsMergeProcessing (typed ) {
389+ childPath := joinObjectPath (path , key )
390+ result .Put (trimmedKey , MergeObject (NewJsonObjectWithCapacity (childCapacity ), typed , keepOverrides , childPath ))
391+ } else {
392+ result .Put (trimmedKey , DeepCopyObject (typed ))
391393 }
392- result .Put (trimmedKey , MergeObject (NewJsonObjectWithCapacity (childCapacity ), typed , keepOverrides , childPath ))
393394 case * JsonArray :
394395 childCapacity := 0
395396 if typed != nil {
396397 childCapacity = len (typed .Value )
397398 }
398- if typed != nil {
399- childPath = joinObjectPath (path , key )
399+ if typed != nil && arrayNeedsMergeProcessing (typed ) {
400+ childPath := joinObjectPath (path , key )
401+ result .Put (trimmedKey , MergeArray (NewJsonArrayWithCapacity (childCapacity ), typed , keepOverrides , childPath ))
402+ } else {
403+ result .Put (trimmedKey , DeepCopyArray (typed ))
400404 }
401- result .Put (trimmedKey , MergeArray (NewJsonArrayWithCapacity (childCapacity ), typed , keepOverrides , childPath ))
402405 default :
403406 result .Put (trimmedKey , value )
404407 }
@@ -414,26 +417,29 @@ func MergeObject(template, parent *JsonObject, keepOverrides bool, path string)
414417 }
415418 baseValue , exists := result .TryGet (key )
416419 if ! exists {
417- childPath := ""
418420 switch typed := value .(type ) {
419421 case * JsonObject :
420422 childCapacity := 0
421423 if typed != nil {
422424 childCapacity = typed .Size ()
423425 }
424- if typed != nil {
425- childPath = joinObjectPath (path , key )
426+ if typed != nil && objectNeedsMergeProcessing (typed ) {
427+ childPath := joinObjectPath (path , key )
428+ result .Put (key , MergeObject (NewJsonObjectWithCapacity (childCapacity ), typed , keepOverrides , childPath ))
429+ } else {
430+ result .Put (key , DeepCopyObject (typed ))
426431 }
427- result .Put (key , MergeObject (NewJsonObjectWithCapacity (childCapacity ), typed , keepOverrides , childPath ))
428432 case * JsonArray :
429433 childCapacity := 0
430434 if typed != nil {
431435 childCapacity = len (typed .Value )
432436 }
433- if typed != nil {
434- childPath = joinObjectPath (path , key )
437+ if typed != nil && arrayNeedsMergeProcessing (typed ) {
438+ childPath := joinObjectPath (path , key )
439+ result .Put (key , MergeArray (NewJsonArrayWithCapacity (childCapacity ), typed , keepOverrides , childPath ))
440+ } else {
441+ result .Put (key , DeepCopyArray (typed ))
435442 }
436- result .Put (key , MergeArray (NewJsonArrayWithCapacity (childCapacity ), typed , keepOverrides , childPath ))
437443 default :
438444 result .Put (key , value )
439445 }
@@ -448,13 +454,12 @@ func MergeObject(template, parent *JsonObject, keepOverrides bool, path string)
448454 result .Put (key , value )
449455 }
450456 case * JsonArray :
451- if _ , ok := baseValue .(* JsonArray ); ok {
452- base := AsArray (result .Get (key ))
457+ if baseArray , ok := baseValue .(* JsonArray ); ok {
453458 childPath := joinObjectPath (path , key )
454459 if isReversedMerge {
455- result .Put (key , MergeArray (typed , base , keepOverrides , childPath ))
460+ result .Put (key , MergeArray (typed , baseArray , keepOverrides , childPath ))
456461 } else {
457- result .Put (key , MergeArray (base , typed , keepOverrides , childPath ))
462+ result .Put (key , MergeArray (baseArray , typed , keepOverrides , childPath ))
458463 }
459464 } else {
460465 result .Put (key , value )
0 commit comments