0

そこで、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 でオブジェクトを逆シリアル化する必要があります。現時点では\n、「説明」の値に改行文字が含まれているため、これは失敗しています。およびその他の順列を使用して文字を適切にエンコードしようとしましたgsub("\n","\\n")が、改行 (および改行のみ) に正しく一致する文字列または正規表現が見つからないようです。/\n/'\n'"\n""\\n"(これは何らかの理由で文字列のどこにでも一致します) などを試しまし/\\n/たが、何も見つかりませんでした。私が見逃しているアイデアはありますか?

更新:これがコードです(javascriptですが、ルビーが埋め込まれています)、javascriptオブジェクトを設定するために使用しようとしています(ERBビューにあるため、山括弧です):

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

to_json私のオブジェクトコードではオーバーライドされていません。標準のレールメソッドだけです。

4

2 に答える 2

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ハッシュにデコードされた後、次のようになります。

{"説明"=>
  "--- \ n- Nulla adipisci quia consequuntur namabet。Eiusenimadaut。Asperioresrecusandae\ nLaboreexercitationem。\nquosprovident。\n"、
 "id" => 295、
 "name" => "Animi enim dolorem soluta eligendi inventore quiadistinctio magni。"、
 "プライバシー"=>0、
 "updated_at" => "2012-11-18T22:24:17Z"、
 "user_id" => 1}

descriptionYAMLとしてエンコードされていない真のJSON文字列に戻すには、次を使用します。

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}
于 2013-01-25T09:44:15.977 に答える
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}

エスケープ文字を操作する必要がある場合は、エスケープ文字を一重引用符で囲みます。


更新後…</p>

var object = JSON.parse('<%= raw @object.to_json.gsub(/\n/, %q!\\n!) %>');
于 2013-01-25T08:45:20.043 に答える