Ruby / Rails - Как я могу предотвратить побег персонажа (или эскейп после)? - PullRequest
9 голосов
/ 31 января 2012

У меня есть некоторый 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:

Этот вопрос SO имелответ

«Проблема в том, что ваш файл может быть действительным JS, но это не допустимый JSON, поэтому библиотеки JSON склонны отклонять его.»

Я доверяю источнику(я), так что, если я бегу:
x = JSON.parse(eval(json))

это работает!

Спасибо.

Ответы [ 2 ]

6 голосов
/ 31 января 2012

Попробуйте:

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
2 голосов
/ 31 января 2012

Он снова экранирует содержимое, так что теперь он экранирован дважды:

Это не совсем так. Это отображается только так, но если вы попытаетесь посчитать обратную косую черту, вы обнаружите, что строка такая же, как в файле:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...