删除ruby JSON中的换行符

时间:2013-01-25 08:15:02

标签: ruby-on-rails ruby json

所以,我使用to_json将Ruby on Rails中的对象序列化为JSON格式。产生的结果是:

'{"description":"---\n- Nulla adipisci quia consequuntur nam ab et. Eius enim ad aut. Asperiores recusandae\n  labore exercitationem.\n    quos provident.\n","id":295,"name":"Animi enim dolorem soluta eligendi inventore quia distinctio magni.","privacy":0,"updated_at":"2012-11-18T22:24:17Z","user_id":1}'

这需要由JSON.parse解析以在客户端javascript中反序列化对象。目前,由于“description”值中的换行符\n,因此失败了。我试图使用gsub("\n","\\n")和其他排列来适当地编码字符,但我似乎无法找到一个正确匹配换行符的字符串或正则表达式(只有换行符)。我尝试了/\n/'\n'"\n""\\n"(由于某种原因,这匹配字符串的所有位置),/\\n/等等,但是避风港找不到任何东西。我缺少什么想法?

更新:这是代码(javascript,但是带有嵌入式ruby)我正在尝试用来填充javascript对象(它在ERB视图中,因此是尖括号):

var object = JSON.parse('<%= raw @object.to_json %>');

to_json在我的目标代码中没有被覆盖,只是标准的rails方法。

2 个答案:

答案 0 :(得分:1)

j = %Q!{"description":"---\n- Nulla adipisci quia consequuntur nam ab et. Eius enim ad aut. Asperiores recusandae\n  labore exercitationem.\n    quos provident.\n","id":295,"name":"Animi enim dolorem soluta eligendi inventore quia distinctio magni.","privacy":0,"updated_at":"2012-11-18T22:24:17Z","user_id":1}!
j.gsub! /\n/, '\\n'
JSON.parse j
# => {"description"=>"---\n- Nulla adipisci quia consequuntur nam ab et. Eius enim ad aut. Asperiores recusandae\n  labore exercitationem.\n    quos provident.\n", "id"=>295, "name"=>"Animi enim dolorem soluta eligendi inventore quia distinctio magni.", "privacy"=>0, "updated_at"=>"2012-11-18T22:24:17Z", "user_id"=>1}

让您的生活变得轻松,在需要操作它们时,在转义字符周围使用单引号。


更新后......

var object = JSON.parse('<%= raw @object.to_json.gsub(/\n/, %q!\\n!) %>');

答案 1 :(得分:1)

您的JSON包含一个YAML字符串,所以不要浪费时间尝试删除换行符,否则会让事情变得更糟,或者至少会让自己做太多工作。

require 'json'
require 'yaml'

json = '{"description":"---\n- Nulla adipisci quia consequuntur nam ab et. Eius enim ad aut. Asperiores recusandae\n  labore exercitationem.\n    quos provident.\n","id":295,"name":"Animi enim dolorem soluta eligendi inventore quia distinctio magni.","privacy":0,"updated_at":"2012-11-18T22:24:17Z","user_id":1}'

hash = JSON[json]
puts YAML.load(hash['description'])

输出:

Nulla adipisci quia consequuntur nam ab et. Eius enim ad aut. Asperiores recusandae labore exercitationem. quos provident.

JSON在解码回Ruby散列后,看起来像:

{"description"=>
  "---\n- Nulla adipisci quia consequuntur nam ab et. Eius enim ad aut. Asperiores recusandae\n  labore exercitationem.\n    quos provident.\n",
 "id"=>295,
 "name"=>"Animi enim dolorem soluta eligendi inventore quia distinctio magni.",
 "privacy"=>0,
 "updated_at"=>"2012-11-18T22:24:17Z",
 "user_id"=>1}

要将其重新转换为真正的JSON字符串,description未编码为YAML,请使用:

hash['description'] = YAML.load(hash['description']).shift
puts hash.to_json

现在看起来像:

{"description":"Nulla adipisci quia consequuntur nam ab et. Eius enim ad aut. Asperiores recusandae labore exercitationem. quos provident.","id":295,"name":"Animi enim dolorem soluta eligendi inventore quia distinctio magni.","privacy":0,"updated_at":"2012-11-18T22:24:17Z","user_id":1}