search
LoginSignup
3

More than 1 year has passed since last update.

posted at

updated at

Organization

ElixirでAPIから取得したJSON(ネストあり)を扱う

ElixirでAPIから取得したJSON(ネストあり)を扱う

by torifukukaiou
1 / 12

はじめに


最終成果

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の方は
  • Linuxの方は、asdf-vmがよいとおもいます(ふだんあまり使っていないのでよくわかっていません)

1. プロジェクト作成

$ mix new mediaarts_db
$ cd mediaarts_db

2. mix.exsdepsを書き換え

mix.exs
  defp deps do
    [
      {:httpoison, "~> 1.6"},
      {:jason, "~> 1.2"}
    ]
  end
  • HTTPoisonJasonを利用します
  • HTTPoisonはHTTPクライアントです
  • JasonJSONのデコード、エンコードを高速に行ってくれます
  • HTTPoisonJasonHexと呼ばれます
  • 1.61.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と呼ばれるものです
  • 直前の関数の実行結果が、次の関数の第一引数に入って次の関数が実行されます
  • |>でつなげています
  • EnumMapElixirでもっともよくつかうモジュールとおもっています
  • プログラミングElixirという本がとても詳しいです
  • こちらの本やElixir Schoolを参考にしてください

Wrapping Up

  • お好みの言語でJSONのパースをお楽しみください!!!
  • |> Pipe operator最高! (Elixir)
  • iexで実行結果をみながら少しずつ組み立てていけるのが気持ちいい (Elixir)
  • Enjoy!!!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3