You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							44 lines
						
					
					
						
							946 B
						
					
					
				
			
		
		
	
	
							44 lines
						
					
					
						
							946 B
						
					
					
				| package testfixtures
 | |
| 
 | |
| import (
 | |
| 	"database/sql/driver"
 | |
| 	"encoding/json"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	_ driver.Valuer = jsonArray{}
 | |
| 	_ driver.Valuer = jsonMap{}
 | |
| )
 | |
| 
 | |
| type jsonArray []interface{}
 | |
| 
 | |
| func (a jsonArray) Value() (driver.Value, error) {
 | |
| 	return json.Marshal(a)
 | |
| }
 | |
| 
 | |
| type jsonMap map[string]interface{}
 | |
| 
 | |
| func (m jsonMap) Value() (driver.Value, error) {
 | |
| 	return json.Marshal(m)
 | |
| }
 | |
| 
 | |
| // Go refuses to convert map[interface{}]interface{} to JSON because JSON only support string keys
 | |
| // So it's necessary to recursively convert all map[interface]interface{} to map[string]interface{}
 | |
| func recursiveToJSON(v interface{}) (r interface{}) {
 | |
| 	switch v := v.(type) {
 | |
| 	case []interface{}:
 | |
| 		for i, e := range v {
 | |
| 			v[i] = recursiveToJSON(e)
 | |
| 		}
 | |
| 		r = jsonArray(v)
 | |
| 	case map[interface{}]interface{}:
 | |
| 		newMap := make(map[string]interface{}, len(v))
 | |
| 		for k, e := range v {
 | |
| 			newMap[k.(string)] = recursiveToJSON(e)
 | |
| 		}
 | |
| 		r = jsonMap(newMap)
 | |
| 	default:
 | |
| 		r = v
 | |
| 	}
 | |
| 	return
 | |
| }
 | |
| 
 |