use JSON.generate so we don't end up using ActiveSupport's json implementation