Ruby on rails Rails escape\u javascript通过转义单引号创建无效JSON
ActionView中的escape\u javascript方法将撇号Ruby on rails Rails escape\u javascript通过转义单引号创建无效JSON,ruby-on-rails,json,escaping,Ruby On Rails,Json,Escaping,ActionView中的escape\u javascript方法将撇号'转义为反斜杠撇号\',这会在解析为JSON时出错 例如,消息“I'm here”在打印为以下格式时是有效的JSON: {"message": "I'm here"} 但是,输出“我在这里”,导致JSON无效: {"message": "I\'m here"} 是否有修补程序可以修复此问题,或者在打印到JSON时有另一种转义字符串的方法?此处可能需要更多详细信息,但JSON字符串必须使用双引号。单引号在JavaScrip
'
转义为反斜杠撇号\'
,这会在解析为JSON时出错
例如,消息“I'm here”在打印为以下格式时是有效的JSON:
{"message": "I'm here"}
但是,
输出“我在这里”
,导致JSON无效:
{"message": "I\'m here"}
是否有修补程序可以修复此问题,或者在打印到JSON时有另一种转义字符串的方法?此处可能需要更多详细信息,但JSON字符串必须使用双引号。单引号在JavaScript字符串中可以使用,但在JSON中不能使用。我最终在我的应用程序\u helper.rb中添加了一个新的
escape\u JSON
方法,该方法基于ActionView::Helpers::JavaScriptHelper
中找到的escape\u JavaScript
方法:
JSON_ESCAPE_MAP = {
'\\' => '\\\\',
'</' => '<\/',
"\r\n" => '\n',
"\n" => '\n',
"\r" => '\n',
'"' => '\\"' }
def escape_json(json)
json.gsub(/(\\|<\/|\r\n|[\n\r"])/) { JSON_ESCAPE_MAP[$1] }
end
JSON\u ESCAPE\u MAP={
'\\' => '\\\\',
只要在字符串上调用.to_json,它就会被正确转义,例如
"foo'bar".to_json
我遇到了一些类似的问题,我需要将Javascript命令放在Rails模板的底部,将字符串放入jQuery.data
,以便以后检索和使用
只要字符串中有一个引号,加载页面时就会出现JavaScript错误
以下是我所做的:
-content_for :extra_javascript do
:javascript
$('#parent_#{parent.id}').data("jsonized_children", "#{escape_javascript(parent.jsonized_children)}");
github/rails中已经存在一个问题
修复将字符串标记为html\u安全
<%= escape_javascript("I'm here".html_safe) %>
或者更好的是,你可以清理字符串
<%= sanitize(escape_javascript("I'm here")) %>
<%= escape_javascript(sanitize("I'm here")) %>
感谢您的回复-为了清晰起见,我添加了一个示例。我对Rails了解不多。但是您是否可以使用中描述的render:json
来转换对象,但不确定是否可以转换字符串。我将研究一下……到目前为止,我发现唯一有效的方法。不确定为什么要使用json来转义引号使用单反斜杠而不是双反斜杠,但这让我有一段时间不舒服。谢谢。如果字符串是HTML,并且在字符串中有双引号,这将不起作用。@margusholland-不正确-。to_json完美地处理了双引号转义“foo'bar”。to_json
输出“foo'bar”
没有,对不起。我返回的JSON显然是中断的,因为有任意数量的单引号。to_JSON
不能处理它们。Rails 4.1