45 lines
		
	
	
		
			946 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			946 B
		
	
	
	
		
			Go
		
	
	
	
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
 | 
						|
}
 |