JavaでJSON形式のAPIを使ってみる

## はじめに
現在JavaでAPIを使って開発を始めました。
JavaでのAPI使用は初めてでググりまくってなんとか実装できたので備忘録的な意味で書いていきます。
まずはじめに一通りの実装からお見せします。
その後、以下のセクションに分けて解説をいたします。

- [APIのURLへ接続する](# APIのURLへ接続する)
- [APIからレスポンスをもらうにはBufferedReaderを使う](# APIからレスポンスをもらうにはBufferedReaderを使う)
- [ObjectMapperを使ってJSON文字列をJavaオブジェクトに変換する](# ObjectMapperを使ってJSON文字列をJavaオブジェクトに変換する)

その中で各セクションの実装部分とその解説を参考文献を見ながらしていきます。
### APIへのリクエストとレスポンス取得
```useJson.java
public static JsonNode getResult(String urlString) {
 String result = "";
 JsonNode root = null;
 try {
	URL url = new URL(urlString);
	HttpURLConnection con = (HttpURLConnection)url.openConnection();
	con.connect(); // URL接続
	BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
	String tmp = "";
	
       while ((tmp = in.readLine()) != null) {
		result += tmp;
	}

	ObjectMapper mapper = new ObjectMapper();
	root = mapper.readTree(result);
	in.close();
	con.disconnect();
 }catch(Exception e) {
 	e.printStackTrace();
 }

 return root;
}

```
### APIのURLへ接続する
 ```useJson.java
URL url = new URL(urlString): // リクエストパラメータ含めたAPIのURLを指定
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.connect(); // URLへ接続
```

#### URLクラス
引数にString型の文字列を指定。
String型の文字列をWeb上へポインタさせる。
[参考：クラスURL](https://docs.oracle.com/javase/jp/8/docs/api/java/net/URL.html)

##### ポインタとは
>ポインタ (pointer) とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照する（指し示す）ものである。

ここで言う論理的位置情報はWeb上の位置（URL）を指す。

[参考：ポインタ (プログラミング)](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))

##### 論理的って何？
>「論理的」とは、きちんと筋道を立てて考える様子のことです。
「論」と「理」の意味は、「筋道」という共通したものです。その他「論」には「議論する」、「理」には「ことわり・条理」という意味もあります。

つまりここで言うとURLへの道を作る（アドレスを指定）となる。

[参考：「論理的」の意味とは？類語の「理論的」との違いや対義語も紹介 「論理的」の意味とは？](https://biz.trans-suite.jp/37195)

#### URLConnectionクラス 
URLで参照するリソースの読み込みと書き込みの両方を行えるようにする

#### openConnection
リモート・リソースへの接続に影響するパラメータを操作する
[参考：クラスURLConnection](https://docs.oracle.com/javase/jp/8/docs/api/java/net/URLConnection.html)

### APIからレスポンスをもらうにはBufferedReaderを使う

```useJson続き.java
String result = "";
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))); // レスポンス受け取る
String tmp = "";
while ((tmp = in.readLine) != null){
 result += tmp;
}
```

#### BufferedReaderクラス
>文字、配列、行をバッファリングすることによって、文字型入力ストリームからテキストを効率良く読み込みます。

ここではJSON形式のテキストを効率良く読み込むことを指す。
[参考： クラスBufferedReader](https://docs.oracle.com/javase/jp/8/docs/api/java/io/BufferedReader.html)

##### バッファリングって何？
>バッファリングとは、複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補ったり、通信の減速や中断に備えて専用の記憶領域に送受信データを一時的に保存しておくこと。

つまりリクエストと共にAPIに接続し始めはある程度データを貯めておき、ある程度貯まったらレスポンス読み込無事で処理速度を早めること
[参考：バッファリング  【 buffering 】  バッファーリング
](http://e-words.jp/w/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%AA%E3%83%B3%E3%82%B0.html)

#### InputStreamReaderクラス
>InputStreamReaderはバイト・ストリームから文字ストリームへの橋渡しの役目を持ちます

ここではJSON形式のレスポンスを文字ストリームに落とし込むことを言う。
[参考：クラスInputStreamReader](https://docs.oracle.com/javase/jp/8/docs/api/java/io/InputStreamReader.html)

#### (HttpURLConnection)con.getInputStream
>この接続からの入力を受け取る入力ストリームを返します。 返された入力ストリームからの読み取り時に、データが読み取り可能になる前に読み取りタイムアウトが過ぎた場合、SocketTimeoutException がスローされます。

「この接続」と言うのはJSONのレスポンスになる。
[参考：getInputStream](https://docs.oracle.com/javase/jp/6/api/java/net/URLConnection.html#getInputStream())

#### in.readLine()
>テキスト行を読み込みます。

レスポンスを一行ずつ読み込む
[参考： クラスBufferedReader メソッドのサマリー readLine()]
(https://docs.oracle.com/javase/jp/8/docs/api/java/io/BufferedReader.html)

### ObjectMapperを使ってJSON文字列をJavaオブジェクトに変換する
```useJson続き②.java
JsonNode jsonResult = null; // 初期化
ObjectMapper mapper = new ObjectMapper();
jsonResult = mapper.readTree(result);

in.close();
con.disconnect();
```

#### ObjectMapperクラス
>JavaオブジェクトとJSON文字列の相互変換ができる。

[参考：Jackson使い方メモ JSON文字列→Javaオブジェクト 
 説明 ](https://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c#%E8%AA%AC%E6%98%8E)

#### mapper.readTree(result)
>そして、ObjectMapper.readTree によって、JSON ファイルのデータを木構造データとしたときの根ノードを、JsonNode 型のオブジェクトとして読み込む。
[参考：Java 向け JSON ライブラリ Jackson でデータを読み込む](https://blog.kymmt.com/entry/jackson)

##### 木構造データって何？
>木構造とは、データ構造の一つで、一つの要素（ノード）が複数の子要素を持ち、一つの子要素が複数の孫要素を持ち、という形で階層が深くなるほど枝分かれしていく構造のこと。木が幹から枝、枝から葉に分岐していく様子に似ているためこのように呼ばれる。

>木構造を構成する要素はノード（node：節）と呼ばれ、ノード同士は親子関係を持ち、親のないノードを根（root）ノード、子のないノードを葉（leaf）ノードと呼ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/b1758fe0-ca73-2670-b599-cd54119db8b9.png)

[参考：木構造  【 tree structure 】  ツリー構造
](http://e-words.jp/w/%E6%9C%A8%E6%A7%8B%E9%80%A0.html)

つまり木構造の一番上のデータ（根ノード）を取得する役割を担っているのが`readTree`と言うことになる。

#### in.close();
BufferedReaderクラスの終了

#### con.disconnect();
URL接続の終了（切断）

## 終わりに
疲れました・・・ｗ
Json形式のAPIに接続するならこんな感じかなーと思います。
ちなみにJavaでJsonを扱うならいくつかのライブラリを入れるのですが、もしかしたら不要なものもあると思うのでわかり次第追記したします。
現状入れているのは以下になります。

 - jackson-annotations-2.8.11.jar
 - jackson-core-2.8.11.jar
 - jackson-databind-2.8.11.6.jar

当記事で何かご指摘や質問があればコメントいただければ幸いです。