merge.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package mergemaps
  2. import "encoding/json"
  3. // Merge recursively merges map `fromMap` into map `ToMap`. Any pre-existing values
  4. // in ToMap are overwritten. Values in fromMap are added to ToMap.
  5. // From http://stackoverflow.com/questions/40491438/merging-two-json-strings-in-golang
  6. func Merge(fromMap, ToMap interface{}) interface{} {
  7. switch fromMap := fromMap.(type) {
  8. case map[string]interface{}:
  9. ToMap, ok := ToMap.(map[string]interface{})
  10. if !ok {
  11. return fromMap
  12. }
  13. for keyToMap, valueToMap := range ToMap {
  14. if valueFromMap, ok := fromMap[keyToMap]; ok {
  15. fromMap[keyToMap] = Merge(valueFromMap, valueToMap)
  16. } else {
  17. fromMap[keyToMap] = valueToMap
  18. }
  19. }
  20. case nil:
  21. // merge(nil, map[string]interface{...}) -> map[string]interface{...}
  22. ToMap, ok := ToMap.(map[string]interface{})
  23. if ok {
  24. return ToMap
  25. }
  26. }
  27. return fromMap
  28. }
  29. // MergeJSON merges the contents of a JSON string into an object representation,
  30. // returning a new object suitable for translating to JSON.
  31. func MergeJSON(object interface{}, additionalJSON []byte) (interface{}, error) {
  32. if len(additionalJSON) == 0 {
  33. return object, nil
  34. }
  35. objectJSON, err := json.Marshal(object)
  36. if err != nil {
  37. return nil, err
  38. }
  39. var objectMap, newMap map[string]interface{}
  40. err = json.Unmarshal(objectJSON, &objectMap)
  41. if err != nil {
  42. return nil, err
  43. }
  44. err = json.Unmarshal(additionalJSON, &newMap)
  45. if err != nil {
  46. return nil, err
  47. }
  48. return Merge(newMap, objectMap), nil
  49. }