はじめに
- @chokunari さんのNode.jsでAPIから取得したJSON(ネストあり)を扱うを拝見しまして、ぜひElixirで書いてみようとおもいました
-
参考にさせていただいた記事と同じように、
https://mediaarts-db.bunka.go.jp/api/search?aipId=C15461
にアクセスして得られたJSONからrecord
->metadata
->schema:name
とたどって値を取り出してみます - Elixirは、1.10.3-otp-22 を使っています
- これまでElixirを全く触ったことがない方向けに書いています
- 私自身がElixir初級者ですが、初級者であるからこそまだ忘れていないElixir言語を使う際に味わえる感動を記録しておきたいとおもっています
最終成果
HTTPoison.get!("https://mediaarts-db.bunka.go.jp/api/search?aipId=C15461")
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("record")
|> Enum.map(&(Map.get(&1, "metadata")))
|> Enum.map(&(Map.get(&1, "schema:name")))
|> Enum.at(0)
- たったのこれだけです
- これだけですみます
メディア芸術データベース(ベータ版)
0. 準備
- まずはElixirをインストールしましょう
- Windowsの方は
- 公式 のインストーラーがあります
- macOSの方は
- a. asdf-vmを使ってインストールする(オススメ)
- (参考) macOS Catalina(10.15.1)にasdfでElixirをインストールする
- Erlangのインストールにけっこう時間がかかります
- b. Homebrewを使ってインストールする
$ brew install elixir
- まず手軽に試してみる感じならこちらのほうが詰まるところは少ないとおもいます
- a. asdf-vmを使ってインストールする(オススメ)
- Linuxの方は、asdf-vmがよいとおもいます(ふだんあまり使っていないのでよくわかっていません)
1. プロジェクト作成
$ mix new mediaarts_db
$ cd mediaarts_db
2. mix.exs
のdeps
を書き換え
mix.exs
defp deps do
[
{:httpoison, "~> 1.6"},
{:jason, "~> 1.2"}
]
end
- HTTPoisonとJasonを利用します
- HTTPoisonはHTTPクライアントです
- JasonはJSONのデコード、エンコードを高速に行ってくれます
- HTTPoisonやJasonはHexと呼ばれます
-
1.6
や1.2
はバージョンです - お試しされるときに、それぞれのHexに書いてある最新の記載内容に従えばよいです
3. mix deps.get
$ mix deps.get
- このコマンドで、依存するHexをダウンロードします
- 実行は
mediaarts_db
ディレクトリの中で行ってください
4. iex -S mix
$ iex -S mix
コンパイルがはじまります
...
iex> HTTPoison.get!("https://mediaarts-db.bunka.go.jp/api/search?aipId=C15461") |> Map.get(:body) |> Jason.decode!() |> Map.get("record") |> Enum.map(&(Map.get(&1, "metadata"))) |> Enum.map(&(Map.get(&1, "schema:name"))) |> Enum.at(0)
["冴えない彼女*の 育てかた[ヒロイン]"]
もう少し見やすくしてみます。
iex> (
...> HTTPoison.get!("https://mediaarts-db.bunka.go.jp/api/search?aipId=C15461")
...> |> Map.get(:body)
...> |> Jason.decode!()
...> |> Map.get("record")
...> |> Enum.map(&(Map.get(&1, "metadata")))
...> |> Enum.map(&(Map.get(&1, "schema:name")))
...> |> Enum.at(0)
...> )
["冴えない彼女*の 育てかた[ヒロイン]"]
元記事と比べてエラー処理を端折っていますが、だいたいの骨格はたったこれだけです。
- 私はこれを一気呵成に全部書いているわけではありません
- うまく文字で説明する自信はないのですが、以下書いてみます
- 一行ずつ書いて結果をみながら次の行を書いている感じです
- まずHTTP Getが必要だよなー どうやるんだろう? iexに
HTTP
くらい押してタブを押す、そうするとHTTPoison
と補完してくれます- 本当にはじめてやる人がどうやってHTTPoisonを探しあてるのか? はもう忘れてしまいましたがまあそこはこの記事を読んでいらっしゃる方ならうまく見つけられることでしょう
- さらにtabをおすと
HTTPoison.
と補完されてさらに、タブをおすと関数の一覧が表示されます - そこでもう一度やりたかったことをおもいだすとHTTP Getなので、いくつか
get
ではじまるものがみつかりますのでそれをつかうのだろうとあたりをつけてヘルプをみてみます iex> h HTTPoison.get
- ↑ iex上で、
h
を使うとヘルプがみれます - ヘルプの内容だけではつかめない場合は公式のドキュメントと向き合います
- わかりやすい英語で書かれていますので、公式のドキュメントをあたるのがオススメです
- たとえば、Usage 等をみるとイメージがつきます
- あとは
body
を取り出して、JSONを扱いやすくして、record
->metadata
->schema:name
とたどって値を取り出します - お気づきだとおもいますが、やりたいことの順番とソースコードの順番がぴったり一致します
-
|>
はPipe operator
と呼ばれるものです - 直前の関数の実行結果が、次の関数の第一引数に入って次の関数が実行されます
-
|>
でつなげています - EnumとMapはElixirでもっともよくつかうモジュールとおもっています
- プログラミングElixirという本がとても詳しいです
- こちらの本やElixir Schoolを参考にしてください