...
1 package mergemaps
2
3 import "encoding/json"
4
5
6
7
8 func Merge(fromMap, ToMap interface{}) interface{} {
9 switch fromMap := fromMap.(type) {
10 case map[string]interface{}:
11 ToMap, ok := ToMap.(map[string]interface{})
12 if !ok {
13 return fromMap
14 }
15 for keyToMap, valueToMap := range ToMap {
16 if valueFromMap, ok := fromMap[keyToMap]; ok {
17 fromMap[keyToMap] = Merge(valueFromMap, valueToMap)
18 } else {
19 fromMap[keyToMap] = valueToMap
20 }
21 }
22 case nil:
23
24 ToMap, ok := ToMap.(map[string]interface{})
25 if ok {
26 return ToMap
27 }
28 }
29 return fromMap
30 }
31
32
33
34 func MergeJSON(object interface{}, additionalJSON []byte) (interface{}, error) {
35 if len(additionalJSON) == 0 {
36 return object, nil
37 }
38 objectJSON, err := json.Marshal(object)
39 if err != nil {
40 return nil, err
41 }
42 var objectMap, newMap map[string]interface{}
43 err = json.Unmarshal(objectJSON, &objectMap)
44 if err != nil {
45 return nil, err
46 }
47 err = json.Unmarshal(additionalJSON, &newMap)
48 if err != nil {
49 return nil, err
50 }
51 return Merge(newMap, objectMap), nil
52 }
53
View as plain text