【Ruby入門】 jsonの扱い方まとめ 【parse load generate to_json】

こんにちは! フリーエンジニアの長瀬です。

みなさんはjsonをご存知ですか?

json形式でのデータの取り扱いはとても軽量でシンプルなので、人気があります。

いまのうちに、Rubyでしっかり取り扱えるようにしておきましょう。

この記事では、jsonの扱い方について

・JSON.load
・JSON.parse

という基本的なメソッドから、

・JSON.generate
・JSON.fast_generate
・JSON.pretty_generate
・to_json

といった応用的なメソッドについても解説していきます。

目次

jsonとは

jsonはJavaScript Object Notationの略でもともとはjavascriptで使用されていたファイル形式です。
非常に軽量で、直感的にデータを扱うことができるため、幅広い言語で使用されています。
Rubyでは、他の言語と連携するためのAPIを作成するときによく使われます。

# jsonの例
{
  "ruby": {
    "rails":30000
  },
  "python": {
    "django":25000
  }
}

APIってなんだろう?と思った方は以下の記事を参考にしてみてください。

jsonの読み込み

それではまずはjsonをファイルから読み込んでみましょう

jsonの読み込みはJSON.loadメソッドJSON.parseメソッドを使用します。

JSON.load

JSON.loadはjsonファイルを読み込み、内容に応じてハッシュや配列といったRubyのオブジェクトに変換します。

今回は下のexample.jsonを読み込んでいきます。

example.json

{
  "ruby": {
    "rails":30000
  },
  "python": {
    "django":25000
  }
}
require 'json'

File.open("example.json") do |file|
  hash = JSON.load(file)
  p hash
end

[実行結果]

{"ruby"=>{"rails"=>30000}, "python"=>{"django"=>25000}}

このように、ハッシュオブジェクトとして読み込むことができました。

JSON.parse

実際、APIを叩いたときに、文字列形式のjsonが返ってくる場合は多くあります。

文字列形式のjsonを読み込む場合にはJSON.parseを使用しましょう。

require 'json'
hash = JSON.parse('{"ruby":{"rails":30000},"python":{"django":25000}}')
p hash

[実行結果]

{"ruby"=>{"rails"=>30000}, "python"=>{"django"=>25000}}

このように、ハッシュオブジェクトとして読み込まれます。

jsonの書き込み

次にjsonのファイルへの書き込み方法について見ていきます。
jsonの書き込みはJSON.dumpメソッドを使用することで可能になります。

require 'json'

File.open("sample.json", 'w') do |file|
  hash = {"ruby"=>{"rails"=>30000}, "python"=>{"django"=>25000}}
  str = JSON.dump(hash, file)
end

sample.json

{"ruby":{"rails":30000},"python":{"django":25000}}

このように改行はありませんが、json形式でファイルを書き込むことができます。

json形式に変換する

さきほどまでは、jsonからRubyオブジェクトに変換する方法を説明しました。

次は、その逆で、Rubyオブジェクトからjson形式に変換する方法を紹介します。

JSON.generate

json.generateはもっとも基本的なメソッドで、引数にハッシュ、配列等のRubyオブジェクトをとり、json形式に変換します。

require 'json'
hash = JSON.generate({"ruby":{"rails":30000},"python":{"django":25000}})
p hash

[実行結果]

"{"ruby":{"rails":30000},"python":{"django":25000}}"

このように、json形式に変換されていることを確認できました。

JSON.fast_generate

json.fast_generateは、循環参照があるかどうかチェックしない代わりにjson形式への変換を高速化します。

循環参照とは、変数同士がお互いの情報を必要としている状態のことです。

xを決定にするのにyの情報が必要とされ、yを決定するにxの情報を必要とするような状態では、どちらも正しく定義できません。
なので、プログラムはエラーを引き起こします。

つまり、そのような状態がないことが明らかな場合にはJSON.fast_generateメソッドを使用できます。

require 'json'
hash = JSON.fast_generate({"ruby":{"rails":30000},"python":{"django":25000}})
p hash

[実行結果]

"{"ruby":{"rails":30000},"python":{"django":25000}}"

このように、実行結果はJSON.generateと同じになります。

JSON.pretty_generate

json.pretty_gerateメソッドでは、見やすい形のjson形式に整形して変換します。

require 'json'
hash = JSON.pretty_generate({"ruby":{"rails":30000},"python":{"django":25000}})
p hash

[実行結果]

"{n  "ruby": {n    "rails": 30000n  },n  "python": {n    "django": 25000n  }n}"

to_json

実は、to_jsonというメソッドも存在していて、こちらでもRubyオブジェクトをjson形式に変換できます。

require 'json'
hash = {"ruby":{"rails":30000},"python":{"django":25000}}.to_json
p hash

[実行結果]

"{"ruby":{"rails":30000},"python":{"django":25000}}"

実行結果は、JSON.generateや、JSON.fast_generateと同じになります。

jsonの読み込み、またはjson形式に変換

最後に、単体のJSONメソッド紹介します。
このJSONメソッドは引数がRubyオブジェクトの場合は、JSON.generateと同じ挙動を示し、文字列の場合はJSON.parseと同じ挙動を示します。

JSON.generateはRubyオブジェクトをjson形式に変換するメソッドで、JSON.parseはその逆で文字列の形式のjsonをRubyオブジェクトに変換するメソッドです。

混同しないように使用しましょう。

require 'json'
hash1 = JSON['{"ruby":{"rails":30000},"python":{"django":25000}}']
hash2 = JSON[{"ruby" => {"rails" => 30000}, "python" => {"django" => 25000}}]
p hash1 #JSON.parseと同じ 文字列JSON→Rubyオブジェクト
p hash2 #JSON.generateと同じ Rubyオブジェクト→JSON

[実行結果]

{"ruby"=>{"rails"=>30000}, "python"=>{"django"=>25000}}
"{"ruby":{"rails":30000},"python":{"django":25000}}"

Rubyを独学で頑張っているけど先が見えない方のために

独学でRubyを頑張っているわけだけど、先が見えない・・・

そんな方、実はいらっしゃるのではないでしょうか?

いや、おれは違うぞ。先のキャリアもしっかり見えてるし、独学の成果も出てきている

そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。

しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。

なぜ「先が見えない」という不安や悩みを抱えてしまうのか

さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRubyを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。

先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。

  • プログラミングの上達が見えない
  • プログラミングを継続できない気がする
  • プログラミングスキルを習得した姿がイメージできない
  • プログラミングスキルを活かした仕事を獲得するイメージができない

これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。

これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。

受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。

未来に光を当て、プログラミング学習を「成果が出るもの」にするために

先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。

これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。

独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。

これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。

実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。

そう言い切れるのは、以前の私もそうだったからです。

エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。

そうは言っても、周りにそういう人がいないし・・・

という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料カウンセリングを利用するのです。

営業をかけられて時間の無駄に終わるでしょ?

という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。

「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料カウンセリングがぴったりだと断言できます。それくらい無料カウンセリングに自信を持っているのです。

さらに、無料カウンセリングには以下の3大特典もついてきます!

  • 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
  • 効率的なオリジナル学習カリキュラム
  • 未経験の転職(フリーランス)を可能にするキャリアサポート

上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料カウンセリング特典です。

ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?

無料カウンセリング予約はこちら

まとめ

いかがでしたでしょうか?

この記事では、jsonの扱い方を解説しました。

jsonを読み込む際にはJSON.loadで、文字列の形式のJSONを読み込むのにはJSON.parseを使用します。

また、Rubyオブジェクトからjson形式に変換するにはJSON.generateJSON.fast_generateJSON.pretty_generateto_jsonがありましたね。

たくさんありますが、それぞれの使い方をしっかりと把握しておきましょう。

jsonでのデータの取り扱いは特にAPIなどでは人気ですので、しっかりとマスターしておいてください。

もしjsonの使い方について忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

目次