我有一些麻烦要逃脱,并且撇号设置在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>
你们有任何想法如何?
谢谢!
答案 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 %>);
取决于具体情况。