| package mergemaps | |
| import "encoding/json" | |
| // Merge recursively merges map `fromMap` into map `ToMap`. Any pre-existing values | |
| // in ToMap are overwritten. Values in fromMap are added to ToMap. | |
| // From http://stackoverflow.com/questions/40491438/merging-two-json-strings-in-golang | |
| func Merge(fromMap, ToMap interface{}) interface{} { | |
| switch fromMap := fromMap.(type) { | |
| case map[string]interface{}: | |
| ToMap, ok := ToMap.(map[string]interface{}) | |
| if !ok { | |
| return fromMap | |
| } | |
| for keyToMap, valueToMap := range ToMap { | |
| if valueFromMap, ok := fromMap[keyToMap]; ok { | |
| fromMap[keyToMap] = Merge(valueFromMap, valueToMap) | |
| } else { | |
| fromMap[keyToMap] = valueToMap | |
| } | |
| } | |
| case nil: | |
| // merge(nil, map[string]interface{...}) -> map[string]interface{...} | |
| ToMap, ok := ToMap.(map[string]interface{}) | |
| if ok { | |
| return ToMap | |
| } | |
| } | |
| return fromMap | |
| } | |
| // MergeJSON merges the contents of a JSON string into an object representation, | |
| // returning a new object suitable for translating to JSON. | |
| func MergeJSON(object interface{}, additionalJSON []byte) (interface{}, error) { | |
| if len(additionalJSON) == 0 { | |
| return object, nil | |
| } | |
| objectJSON, err := json.Marshal(object) | |
| if err != nil { | |
| return nil, err | |
| } | |
| var objectMap, newMap map[string]interface{} | |
| err = json.Unmarshal(objectJSON, &objectMap) | |
| if err != nil { | |
| return nil, err | |
| } | |
| err = json.Unmarshal(additionalJSON, &newMap) | |
| if err != nil { | |
| return nil, err | |
| } | |
| return Merge(newMap, objectMap), nil | |
| } |