ruby-on-rails - Ruby (Rails) 取消转义字符串 -- undo Array.to_s

标签 ruby-on-rails ruby http string http-headers

一直在破解几个库,遇到一个字符串被“双重转义”的问题。

例如: 固定示例

 > x = ['a']
 => ["a"] 
 > x.to_s
 => "[\"a\"]" 
 > 

然后再到

\"\[\\\"s\\\"\]\"

这是在处理 http header 时发生的。我有一个 header ,它将是一个数组,但 http 库正在对 array.to_s 值执行它自己的字符转义。

我找到的解决方法是自己将数组转换为字符串,然后“撤消”to_s。像这样: formatted_value = value.to_s

if value.instance_of?(Array)
  formatted_value = formatted_value.gsub(/\\/,"") #remove backslash                                                 
  formatted_value = formatted_value.gsub(/"/,"")  #remove single quote
  formatted_value = formatted_value.gsub(/\[/,"") #remove [                                                                                                     
  formatted_value = formatted_value.gsub(/\]/,"") #remove ]   
end
value = formatted_value

...一定有更好的方法...(无需猴子修补我正在使用的 gems)。 (是的,如果我的字符串实际上包含这些字符串,就会中断。)

建议?

** 更新 2 **

好的。在这附近仍然有麻烦,但现在我想我已经找到了核心问题。它在 to_s 调用后将我的数组序列化为 json。至少,这似乎重现了我所看到的。

['a'].to_s.to_json

我在 gem 中调用一个返回 to_s 结果的方法,然后在其上调用 to_json。

最佳答案

由于您修改过的问题,我修改了我的答案:

我仍然无法复制您的结果!

>> x = ['a']
=> ["a"]
>> x.to_s
=> "a"

但是当我将最后一次调用更改为:

>> x.inspect
=> "[\"a\"]"

所以我假设这就是您正在做的事情?

它不一定转义值 - 本身。它像这样存储字符串:

%{["a"]}

或者更确切地说:

'["a"]'

无论如何。这应该可以取消字符串化:

>> x = ['a']
=> ["a"]
>> y = x.inspect
=> "[\"a\"]"
>> z = Array.class_eval(y)
=> ["a"]
>> x == z
=> true

虽然我对使用 class_eval 的安全性持怀疑态度,但要警惕用户输入,因为它可能会产生意想不到的副作用(我指的是代码注入(inject)攻击),除非你非常确定您知道原始数据的来源,或者允许通过它的内容。

关于ruby-on-rails - Ruby (Rails) 取消转义字符串 -- undo Array.to_s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5235124/

相关文章:

ruby-on-rails - 如果 rails 中的 Controller 中有 if 语句,我应该将 response_to 放在哪里?

ruby-on-rails - 我将如何存储可能是部分的日期(即只有年份,也可能是月份)并稍后以相同的规范输出它?

ruby-on-rails - Rails 内存泄漏的主要因素

ruby - RSpec NoMethodError : "undefined method ` describe' for main Object"

ruby - Ruby 新手,遇到 LOAD_PATH 问题

http - 在服务器响应中不包含内容长度 header 的后果是什么?

javascript - 我如何实现远程 : true functionality without link_to?

python - 帮我写我的 LISP :) LISP environments, Ruby Hashes

通过特定端口创建原始 HTTP 请求

java - 测量 Spring RestTemplate HTTP 请求时间