code: func stringifyMapKeys(in interface{}) (interface{}, bool) {
  
  	switch in := in.(type) {
  	case []interface{}:
  		for i, v := range in {
  			if vv, replaced := stringifyMapKeys(v); replaced {
  				in[i] = vv
  			}
  		}
  	case map[string]interface{}:
  		for k, v := range in {
  			if vv, changed := stringifyMapKeys(v); changed {
  				in[k] = vv
  			}
  		}
  	case map[interface{}]interface{}:
  		res := make(map[string]interface{})
  		var (
  			ok  bool
  			err error
  		)
  		for k, v := range in {
  			var ks string
  
  			if ks, ok = k.(string); !ok {
  				ks, err = cast.ToStringE(k)
  				if err != nil {
  					ks = fmt.Sprintf("%v", k)
  				}
  			}
  			if vv, replaced := stringifyMapKeys(v); replaced {
  				res[ks] = vv
  			} else {
  				res[ks] = v
  			}
  		}
  		return res, true
  	}
  
  	return nil, false
  }
docs: // stringifyMapKeys recurses into in and changes all instances of
  // map[interface{}]interface{} to map[string]interface{}. This is useful to
  // work around the impedance mismatch between JSON and YAML unmarshaling that's
  // described here: https://github.com/go-yaml/yaml/issues/139
  //
  // Inspired by https://github.com/stripe/stripe-mock, MIT licensed