I usually use ConfigObject for this. It does deep merge along other goodies.
a= [ "a" : "1", "animals" : ["cat" : "blue"] ] b= [ "b" : 2, "animals" : ["dog" : "red"] ] result = (HashMap)new ConfigObject(a).merge(((ConfigObject)b))