Ruby
JSON

JSONについてRubyを使用しながら簡単に解説してみる

はじめに

今更な気がしますが、jsonについてrubyを使いながら解説していこうと思います。
jsonとはデータフォーマットの一つで、webAPIなどにリクエストを送った時にハッシュや配列などの扱いやすいデータ構造として取得することができます。
また、ハッシュや配列などのシンプルな構造のためプログラム間でのデータのやり取りなど相性が良いです。

まずはターミナルから実行してみる

今回は検証用として、郵便番号データを提供している郵便番号検索APIを使用してみる
jsonとはどんなデータ型なのかを確かめるために、まずはターミナルから実行してみようと思います

bash
$ curl http://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060

上記は単純にGETリクエストを送っている。また、リクエストパラメータのzipcodeの値に適当な郵便番号を記述する。
次に取得したjsonデータについて見てみる

bash
{
    "message": null,
    "results": [
        {
            "address1": "高知県",
            "address2": "南国市",
            "address3": "蛍が丘",
            "kana1": "コウチケン",
            "kana2": "ナンコクシ",
            "kana3": "ホタルガオカ",
            "prefcode": "39",
            "zipcode": "7830060"
        }
    ],
    "status": 200
}

上記がjsonとして帰ってくるデータ型となります。内容を見ますとaddressの値に郵便番号に紐付く住所が記載されております。次にデータを配列やハッシュなどで取得して見たいと思います。

rubyを使ってjson形式でデータを取得してみる

rubyを使って下記の流れでプログラムを作成して行きたいと思います。

webAPIにリクエスト  ➡︎ json形式のデータを取得 ➡︎ 表示

webAPIにリクエスト

webAPIにリクエストするにはHTTPメソッドのGETを使用します。
以下がサンプルとなります。

sample.rb
require 'net/http' #標準ライブラリの呼び出し
require 'uri'
require "json" #jsonを使うためのライブラリ

#指定のURLにJSONデータをリクエストしている
res = Net::HTTP.get(URI.parse('http://zipcloud.ibsnet.co.jp/api/search?zipcode=6695221'))

#表示する
puts res
実行結果
{
    "message": null,
    "results": [
        {
            "address1": "兵庫県",
            "address2": "朝来市",
            "address3": "和田山町秋葉台",
            "kana1": "ヒョウゴケン",
            "kana2": "アサゴシ",
            "kana3": "ワダヤマチョウアキバダイ",
            "prefcode": "28",
            "zipcode": "6695221"
        }
    ],
    "status": 200
}

次にJSON形式で返却された文字列をハッシュの形式にして、兵庫県のデータを取得してみる

sample.rb
#文字列からhash形式に変換する
hash = JSON.parse(res)

#兵庫県のデータを取り出す

puts hash["results"][0]["address1"]
実行結果
兵庫県

上記を実行すると兵庫県のデータが取り出せることが分かりました。

次は少し実践的なプログラムを書いてみます。プログラムから入力し、それが有効な郵便番号なら住所を表示し、
無効な郵便番号ならメッセージを出力する

post.rb
require 'net/http' 
require "json"
require 'uri'

#住所を返却する。無効な郵便番号に関してはメッセージを返す
def search_address(post_code)
  res = Net::HTTP.get(URI.parse("http://zipcloud.ibsnet.co.jp/api/search?zipcode=#{post_code}"))
  hash = JSON.parse(res)

#有効な郵便番号の判別
  if hash["status"] == 200
    #住所を返す
    return hash["results"][0].values.take(3).join("")
  else
    #エラーメッセージを返す
    return hash["message"]
  end
end

print "検索する郵便番号を入力してください(ハイフン無し):"
post_code = gets.chomp

#結果を表示する
puts search_address(post_code)

実行結果
$ ruby post.rb
検索する郵便番号を入力してください(ハイフン無し):6695221
兵庫県朝来市和田山町秋葉台

rubyによる色々なjsonの使い方

上記の方法以外にもjsonファイルからロードしてhashとしてプログラムから使用することが出来る。
以下のサイトを参考にするのが良いだろう。時間があれば自分でもここに追記してみる。

RubyでJSONを扱うときに便利な関数まとめ

終わりに

今回はjsonについて軽く触れてみた。他にも色々なことが出来るので時間がある時に追記する。

参考

library net/http
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
RubyでJSONを扱うときに便利な関数まとめ