mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-01 00:23:56 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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
 | |
| }
 | 
