Escape和Apostrophe设置JSON通过rails传递给JS

时间:2017-06-20 17:15:42

标签: javascript ruby-on-rails json ruby

我有一些麻烦要逃脱,并且撇号设置在JSON数组上。 我有这个:

@option_change = OptionChange.new(@product).to_json.html_safe

在JS文件中我以这种方式使用它:

var json_test = $.parseJSON('<%= @option_change %>');

执行此js时,这是返回:(这是我@option_change的内容)

'"[{"option":1,"properties":[{"sequence":null,"option_value":{"id":3,"value":"Test'WithError","image_uid":null,"image_name":null,"description":""},"product_sku_id":82,"available_stock":true}],"next_option":null}]"'

由于在Test'WithError上设置了撇号,我得到了一个错误,我尝试使用gsub。(“'”,“\\'”),就像在其他帖子上建议的一样,但我认为我的问题需要更加具体要解决的方法。

@product:#<Product id: 48, name: "[ADENA][TESTE] 365b4ea2f838", resume: "365b4ea2f838", description: "<p>\r\n\t365b4ea2f838</p>\r\n", created_at: "2017-06-14 21:29:05", updated_at: "2017-06-20 13:10:58", category_id: 1, highlight: 0, highlight_image: nil, category_highlight: false, meta_description_deprecate: nil, meta_keywords_deprecate: nil, seo_title_deprecate: nil, custom_title_deprecate: nil, brand_id: nil, profile_property_id: nil, video_url: "", creditcard_split_config_id: nil, code: nil, product_type_id: 1, unpackable: false, ensemble: false, quantity_uses_decimal: false, minimum_to_buy: #<BigDecimal:7f93ee2f7f90,'0.1E1',9(18)>, delta: true, availability: true, visits: 73, additions: 0, removals: 0, custom_delivery_time_deprecated: nil, sales: nil, google_shopping_identifier_exists: true, private: false, keywords: "", extends_delivery_type: "minute", extends_delivery_time: nil>

你们有任何想法如何?

谢谢!

1 个答案:

答案 0 :(得分:1)

单引号在JSON中没有特殊含义,因此to_json不会逃避它们。例如:

> puts "'".to_json
"'"

另请注意,to_json包含字符串中的外引号,所以像这样:

'<%= some_string.to_json %>'

将双引号JSON字符串包装在单引号中,您最终会产生如下混淆:

'"{\"k\":\"v\"}"'
'"{\"k\":\"'\"}"'
// --------^ broken string due to an un-escaped inner quote

当你真正想要的时候:

"{\"k\":\"v\"}"
"{\"k\":\"'\"}"
// -------^ Not broken as there are no outer single quotes to fight with

在JavaScript中考虑这些结果:

> JSON.parse("{\"k\":\"v\"}")
< {k: "v"}

> JSON.parse('"{\"k\":\"v\"}"')
< SyntaxError: JSON Parse error: Unable to parse JSON string

第一个是您可能会追求的。

我想你只想删掉额外的引号:

var json_test = $.parseJSON(<%= @option_change %>);

或者更好(IMO)将编码推送到视图中,以便您的Ruby说:

@option_change = OptionChange.new(@product)

你的观点说:

var json_test = $.parseJSON(<%= @option_change.to_json.html_safe %>);

var json_test = $.parseJSON(<%= @option_change.to_json %>);

取决于具体情况。