Ruby on rails Rails escape\u javascript通过转义单引号创建无效JSON

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

ActionView中的escape\u javascript方法将撇号
'
转义为反斜杠撇号
\'
,这会在解析为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