Base64 は厄介者 (議論を混乱させる可能性があるもの) であるため、それについては少し脇に置きましょう。
JSON は配列を表すことができるので、ここから始めます。何かの 2 つが必要だからです。JavaScript とブラウザーが行うことを行うふりをするのは簡単です。
require 'json'
ary = ['content for box one', 'content for box two']
puts JSON[ary]
# >> ["content for box one","content for box two"]
この時点で、2 つの ASCII 文字列を含む配列に対して JavaScript が作成するのと同じ種類のベース文字列ができました。テストのこの部分では、ASCII かバイナリかは重要ではありません。
JSON は、配列内の文字列の内容だけを残していることに注意してください。これらの文字列内で BASE64 エンコーディングを使用でき、JSON がそれをそのままにしておくことがわかります。
puts JSON[ ary.map{ |s| Base64.encode64(s) } ]
# >> ["Y29udGVudCBmb3IgYm94IG9uZQ==\n","Y29udGVudCBmb3IgYm94IHR3bw==\n"]
これは、Rails で逆のプロセスを実行する前に受け取りたい JSON 文字列の種類を示しています。
さらに混乱させるために、それを変数に割り当てます(ブラウザから受信したかのように):
incoming_json = JSON[ary.map{ |s| Base64.encode64(s) } ]
incoming_json
# => "[\"Y29udGVudCBmb3IgYm94IG9uZQ==\\n\",\"Y29udGVudCBmb3IgYm94IHR3bw==\\n\"]"
Pretendincoming_json
は、Rails が受け取る JSON です。これを に渡してJSON[]
デコードすると、受信文字列が BASE64 でエンコードされた文字列の配列に返されます。これが受信コンテンツになります。それらを BASE64 からデコードすると、送信されたものの配列が得られます。
JSON[incoming_json].map{ |s| Base64.decode64(s) }
# => ["content for box one", "content for box two"]
これは、2 つの「バイナリ」ストリームの往復のエンコードとデコードです。それが ASCII テキストであるかバイナリ データのストリームであるかは BASE64 にとって重要ではなく、JSON も気にしません。なぜなら、Ruby 配列を作成するためにラッパーを元に戻すことだけに関係するからです。これらの配列要素の内部にあるものは、JSON ではなく、何か別の問題になります。そのため、「ラップされていない」配列を に渡しmap
、要素を操作できるようにします。