我有一些已经被转义的文本文件中的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\"}"
'
意外的令牌在哪里?
感谢。
编辑2:
This SO question had the answer
“问题是您的文件可能是有效的JS,但它不是有效的JSON,因此JSON库倾向于拒绝它。”
我相信来源(我),所以如果我跑:
x = JSON.parse(eval(json))
它有效!
感谢。
答案 0 :(得分:6)
试试这个:
require 'json'
JSON.parse(File.read("\file\path.txt"))
编辑:
IRB的输出:
1.9.3p0 :006 > json = JSON.parse("{\"hey\":\"there\"}")
=> {"hey"=>"there"}
如果你仍然希望它是一个字符串:
1.9.3p0 :007 > json = JSON.parse("{\"hey\":\"there\"}").to_s
1.9.3p0 :008 > puts json
{"hey"=>"there"}
=> nil
答案 1 :(得分: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