Ruby/Rails - 如何防止字符转义(或之后的unescape)?

joh*_*kes 9 ruby escaping

我有一些已经被转义的文本文件中的json:
"{\"hey\":\"there\"}"

当我尝试读取文件时:
File.open("\file\path.txt").read
它再次转义内容,以便现在双重转义:
"\"{\\\"hey\\\":\\\"there\\\"}\""

有办法防止逃跑吗?
或者,是否有一种简单的方法可以在读取和转义字符串后对其进行处理?

谢谢.

编辑:
答案是有道理的,但无论如何我似乎无法解析JSON.

irb(main):018:0> json
=> "\"{\\\"hey\\\":\\\"there\\\"}\"\n"  


irb(main):019:0> puts json  
"{\"hey\":\"there\"}"  
=> nil 


irb(main):017:0> x = JSON.parse(json)  
JSON::ParserError: 751: unexpected token at '"{\"hey\":\"there\"}"  
'
Run Code Online (Sandbox Code Playgroud)

意外的令牌在哪里?

谢谢.

编辑2:

这个问题得到了答案

"问题是你的文件可能是有效的JS,但它不是有效的JSON,所以JSON库倾向于拒绝它."

我相信来源(我),所以如果我跑:
x = JSON.parse(eval(json))

有用!

谢谢.

Eug*_*ene 6

试试这个:

require 'json'
JSON.parse(File.read("\file\path.txt"))
Run Code Online (Sandbox Code Playgroud)

编辑:

IRB的输出:

1.9.3p0 :006 > json = JSON.parse("{\"hey\":\"there\"}")
=> {"hey"=>"there"}
Run Code Online (Sandbox Code Playgroud)

如果你仍然希望它是一个字符串:

1.9.3p0 :007 > json = JSON.parse("{\"hey\":\"there\"}").to_s
1.9.3p0 :008 > puts json
{"hey"=>"there"}
=> nil
Run Code Online (Sandbox Code Playgroud)


Ine*_*neu 2

它再次转义内容,因此现在是双重转义的:

事实并非如此。它只是以这种方式显示,但如果你尝试计算反斜杠,你会发现该字符串与文件中的相同:

ineu@ineu ~ % cat > 1.txt
"{\"hey\":\"there\"}"
ineu@ineu ~ % pry
[1] pry(main)> a = File.open('1.txt').read
=> "\"{\\\"hey\\\":\\\"there\\\"}\"\n"
[2] pry(main)> puts a
"{\"hey\":\"there\"}"
=> nil
[3] pry(main)> a.count '\\'
=> 4
Run Code Online (Sandbox Code Playgroud)