JSON形式で書かれた文字列をJavaScriptで利用するにはJSON.parseメソッドを使いますが、Rubyも同じです。RubyにもJSONクラスがあり、そこで定義されたparseメソッドを使って、JSONをRubyのオブジェクトに変換します。では、parseメソッドはどう使えばいいのでしょうか。
今回はRubyでJSONを利用したい方のために、JSONを取り込む際に利用するparseメソッドについて紹介します。
JSONをparseするとどうなる
最近JSONをparseする解説をネットでよく見かけるようになりました。JSONが気になっている方が多いかもしれません。しかし、そもそもJSONとは何か、またparseするとはどんなことかを知らないと、そのような記事を理解できません。
そこでまずは「JSONをparseする」とはどういうことかも含めて知りたい方に、JSONについて解説します。
JSONはJavaScriptのフォーマット
今回解説するJSONとは、JavaScript Object Notationの略で、そのまま日本語に翻訳すると「JavaScrptオブジェクトの表記フォーマット」です。主にWebブラウザによる非同期通信のデータフォーマットとして使われており、JavaScriuptを利用したプログラムでは必須のフォーマットと言えます。
なお名前にJavaScriptが含まれていますがシンプルな表現方法のため、多くのプログラム言語でも利用できるフォーマットです。もちろんRubyにもJSONを扱うためのクラスが用意されています。
parseするとは
英語のparseの意味は「解析する」です。そのためJSONをparseすると言えば、JSONに記述されたデータを解析することを意味しています。
なおプログラミング言語の関数やメソッドには英単語がそのまま使われているケースが多いのですが、このparseも英単語がそのままメソッド名として使われたケースです。
そしてJavaScriptでJSONを解析するのにparseメソッドが使えますが、RubyでもJSONを解析するのにparseが使えます。
RubyでJSONをparseするメリット
先ほどJSONはWebブラウザの非同期通信でよく利用されると説明しましたが、Ruby on RailsでJSONを生成し、Webブラウザに送信するケースが多いでしょう。しかし、複雑なデータでもシンプルに記述できるJSONは他の用途でも活用できます。
例えば、設定情報を記載そたテキストファイルをRubyのプログラムで利用する場合、JSONで書いておけば読みやすいうえ、Rubyのparse機能を利用してシンプルなプログラムを記述できます。
JSONクラスのparseメソッドの基本
次から、RubyのJSONライブラリに定義されているparseメソッドについて解説します。
parseメソッドの文法
parseメソッドは、引数でJSON形式の文字列をRubyのオブジェクトに変換して返すメソッドです。ただし、parseメソッドを利用するためにJSONライブラリを読み込まなければなりません。そのうえで下記の例のように使用します。
parseメソッドの基本的な使用例
require("json") json = '{"No":3,"name":"Suzuki"}' hash = JSON.parse(json) p hash # {"No"=>1, "name"=>"Suzuki"} が表示される
上記のプログラムは変数jsonに格納されたJSONフォーマットのデータを、parseメソッドを利用してRubuのハッシュに変換する例です。JSONのキーと値のペアがハッシュとして変換されているので、Rubyのプログラムの中で利用できます。
シンボルを使ったハッシュに変換する
先ほどparseメソッドの基本的な使い方として文字列のキーと値で構成されたハッシュに変換する方法を紹介しましたが、オプションでシンボルを使ったハッシュに変換することも可能です。JSONの文字列に続いて「symbolize_names: true」を指定してください。
シンボルを使ったハッシュに変換する例
require("json") json = '{"No":3,"name":"Suzuki"}' hash = JSON.parse(json, symbolize_names: true) p hash # {:No=>1, :name=>"Suzuki"} が表示される
階層の深さを制限する
JSONは、その構造上いくらでも階層を増やせます。しかしプログラムで処理する場合、ある程度の階層に制限しておかないとハッシュの変数に変換できません。具体的にはRubyのparseメソッドのデフォルトは19です。それより階層が深い場合はエラーになるので注意してください。
しかし、実際にはそれほど階層の深いデータが作られることはなく、誤動作等によって作られたデータかもしれません。そのような場合は、オプションで処理可能な階層の深さを制限できます。
例えば、階層の深さを5に制限し、それより階層が深い場合はエラーとして処理する場合、オプションに「max_nesting: 5」を指定してください。
JSONをparseする応用例
JSONが主に利用されるのはWebブラウザのJavaScriptを利用した非同期通信です。なお、非同期通信と言っても特別なアクセス方法が使われる訳ではありません。http接続のGETまたはPOSTで通信します。そのためRubyのURIモジュールとnet/httpライブラリを使えば簡単にJSONを取得できます。
次から、RubyのURIモジュールとnet/httpライブラリを利用して取得したJSONをparseメソッドを利用してRubyのオブジェクトに変換する例を紹介します。
Webで参照できるJSONを取り込む
データをシンプルに表現できるJSONはWebシステムとも相性が良いことから、特定のURLにアクセスするとJSONでデータを取り出せるサービスを作れます。そのため、そのようなサイトにRubyのプログラムからアクセスし、JSONで受け取った情報を活用したサイトを作ることが可能です。
具体的にはURIモジュールを利用して指定したURIからJSONを文字列として受けとり、その文字列に対してJSONのparseメソッドを適用してRubyのオブジェクトに変換します。
URIライブラリとJSONのparseメソッドを利用したRubyのプログラムの例
require 'json' require 'uri' require 'net/http' uri = URI.parse(json_url) json = Net::HTTP.get(uri) result = JSON.parse(json)
この例では、変数json_urlに格納されたデータをJSONで提供するWebサイトにアクセスし、GETで文字列として変数jsonで受け取り、parseメソッドを利用してRubyのオブジェクトresultに変換しています。
URIのPOSTモードで受け取る
先ほどhttp通信のGETメソッドでJSONを受け取る方法を紹介しましたが、WebブラウザのJavaScriptではPOSTメソッドの非同期通信でJSONを受け取るケースの方が多いでしょう。RubyでもPOSTメソッドでWebサーバーをアクセスし、JSONを取得することも可能です。次にその例を紹介します。
require 'json' require 'uri' require 'net/http' uri = URI.parse(json_url) res = Net::HTTP.post_form(uri, post_data ) result = JSON.parse(res.body)
この例では、変数json_urlに格納されたデータをJSONで提供するWebサイトにアクセスし、POSTで送信する変数と値を格納したpost_dataを使ってPOSTメソッドで、変数jsonにJSONを受け取ります。そして、parseメソッドを利用してRubyのオブジェクトresultに変換しています。
まとめ
JSONはJavaScript用のデータ形式で、Webブラウザの非同期通信などでよく利用されているフォーマットです。そしてRubyもJSONをサポートしており、parseメソッドを利用すればJSONをRubyのオブジェクトに変換できます。
なお、今回応用例として紹介したように、RubyのHTTPアクセス機能を利用すればWebサーバーからJSONを取得し、それをRubyのプログラムでも利用できます。Webサーバーの動作チェックや自動で情報収集する仕組みなどでも利用できるので、ぜひうまく活用してください。