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 }