2011-04-26 69 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