2011-04-26 85 views
1

我有一個rails應用程序爲iphone/android客戶端提供api。我在做Message.find(1).to_json(:包括=>:用戶)。?但是,增加了\圍繞「逃吧在rails 3中格式化JSON對象

如何防止to_json逃逸雙引號

>> { "a" => "blah" }.to_json 
=> "{\"a\":\"blah\"}" 

我想它是{ "a" : "blah" }{ a : "blah" }

+0

這是逃避的東西,你爲什麼要刪除它? – fl00r 2011-04-26 20:22:00

+0

json在iOS端解析失敗,因爲它有\引號。有了這個應用程序,將永遠不會有任何報價。 – ed1t 2011-04-26 20:36:15

回答

2

它看起來像這其實是你想要的。

你們看到的是格式化顯示(和可讀性)的字符串。它由雙分隔報價,所以雙引號裏面的字符串都被轉義了。實際上,該字符串包含雙引號,但對於文字表示,它們會被轉義。如果你堅持這個JSON解析器,你會發現它返回你想要的對象。

如果你要打印出來,你會發現你得到了你想要的格式。

irb(main):001:0> puts { "a" => "blah" }.to_json 
{"a":"blah"} 
=> nil 

有關詳細說明,請嘗試解析它。您結束的字符串會返回您的原始對象,因爲JSON由字符串表示。但是,試圖插入所需的內容會給你一個討厭的語法錯誤或TypeError。這是因爲JSON不是Ruby中的文字,而在JavaScript中它可以用作文字對象。在Ruby中,它是以字符串形式表示的。

irb(main):002:0> JSON.parse("{\"a\":\"blah\"}") 
=> {"a"=>"blah"} 

irb(main):003:0> JSON.parse({ "a" : "blah" }) 
SyntaxError: (irb):3: syntax error, unexpected ':', expecting tASSOC 
JSON.parse({ "a" : "blah" }) 
       ^
(irb):3: syntax error, unexpected '}', expecting $end 
JSON.parse({ "a" : "blah" }) 
        ^
irb(main):004:0> JSON.parse({a:"blah"}) 
TypeError: can't convert Hash into String 
+0

在irb中,您可以通過調用puts對結果(即puts {「a」=>「blah」} .to_json)來查看未加引號的非轉義字符串。 – 2011-04-26 20:57:36

+0

啊,呵呵。我會編輯以避免迂迴的方式。我今天的想法在哪裏。 – Mario 2011-04-26 20:59:21

+0

我使用as_json而不是to_json,這似乎工作,但我不知道兩者之間有什麼區別 – ed1t 2011-04-27 02:19:23