Jacksonの便利な使い方 [初心者向け]

#1. 概要
##(1)Jacksonとは
- Java用の**JSON**パーサーライブラリの１つ
- JavaオブジェクトとJSONの相互変換ができる

要約すると、
・JSONをJavaオブジェクトに変換できる
・JavaオブジェクトをJSONに変換できる


##(2)JSONとは
###①JSON概要
1. 「JavaScript Object Notation」の略
2. テキストフォーマットの一種
3. シンプルで軽量
4. null,真偽値,数値,文字列,配列,オブジェクト(連想配列)のデータを、**文字列**で表現できる
5. 配列とオブジェクト(連想配列)は、**ネスト(入れ子)構造**で表現する事ができる
6. null と記述すると、null 値を表現できる
7. データは keyとvalue のペア
8. データはカンマで区切られる
9. 波括弧{}の中はオブジェクト
10. 角括弧[]の中は配列

###②JSONサンプル

```json
{ "firstName":"Nobunaga" , "lastName":"Oda" }
```
- "firstName"と"lastName"がKey
- "Nobunaga"と"Oda"がvalue
- valueが文字列なので""で囲っている


###③JSONのメリット
- XMLの代わりにJSONを利用することで冗長なXMLと比べて通信時のデータ量を削減できるなどのメリットがあります。
- JavaScriptに限らず言語をこえたデータ交換のためのデータフォーマットとしてJSONを利用することができる。

##(3)Jacksonで登場人物

###①JSON文字列

```json
{"nobunaga":1534,"hideyoshi":1537,"ieyasu":1543}
```
###②Javaオブジェクト

```java
public class Eiketsu {
   public int nobunaga;
   public int hideyoshi;
   public int ieyasu;
}
```

##(4)何故Jacksonを使うのか
例えば、Jacksonを考慮せず(使わず)JSON文字列をJavaオブジェクトに変換しようとすると、Javaの文字列をsubstringなどを使用して分解して各々のフィールドに格納するなどの作業が必要になる。
文字列編集などの大変な作業をJacksonが簡単に変換作業を行ってくれるために非常に便利。



#2. 使用方法
##(1)ダウンロード
Jacksonで必要とされるJARファイルは、その用途によって複数に分割されていますが、ここでは何も考えず、以下の3つをダウンロードします。
以下から①Streaming API、②Databind、③Annotations をダウンロード
http://wiki.fasterxml.com/JacksonDownload

###①jackson-core
「**jackson-core-2.3.5.jar**」
データを順に読み込みながら処理するため、最もパフォーマンスの良い方法
###②jackson-databind
「**jackson-databind-2.3.4.jar**」
JSONデータをJavaのデータ型と相互に変換できます
###③jackson-annotations
「**jackson-annotations-2.3.0.jar**」

##(2)ライブラリーに追加
ダウンロードした3種のjarファイルをライブラリに追加して使えるようにします。
ここではEclipseで使用する前提です。

①Eclipse上でjacksonを使用したいプロジェクト内のlibフォルダ内に追加(配置)する。
②追加した3種のjarファイルを選択して、右クリックから「ビルド・パス」を選択し「ビルド・パスに追加」を選択する

以上でjacksonライブラリーを使用できるようになります。

#3. JSON文字列 ⇒ Javaオブジェクト
##(1)書式
```java:実行クラス
public class Main {

     public static void main(String[] args) throws IOException {
          String json = "JSON文字列が入る";

          ObjectMapper mapper = new ObjectMapper();
          DTOクラス DTOインスタンス = mapper.readValue(json, DTOクラス.class);

          System.out.println(DTOインスタンス.メンバ名);
     }
}
```

##(2)凡例
```java
public class Main {

     public static void main(String[] args) throws IOException {
          String json = "{\"name\":\"Nobunaga\", \"email\":\"nobunaga@gmail.com\"}";

          ObjectMapper mapper = new ObjectMapper();
          Info info  = mapper.readValue(json, Info.class);

          System.out.println(info.name);
     }
}
```

```java:console
"Nobunaga"
```


#4. Javaオブジェクト ⇒ JSON文字列
##(1)書式
```java:DTOクラス
public class DTOクラス {
	public String メンバ名1;
	public String メンバ名2;
}
```

```java:実行クラス
public class Main {

    public static void main(String[] args) throws JsonProcessingException {
        DTOクラス DTOインスタンス = new DTOクラス();
        DTOインスタンス.メンバ名1 = 値;
        DTOインスタンス.メンバ名2 = 値;

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(DTOインスタンス);

        System.out.println(json);
    }
}
```

##(2)凡例
```java:Info.java
public class Info {
	public String name;
	public String email;
}
```

```java:Main.java
public class Main {

    public static void main(String[] args) throws JsonProcessingException {
        Info info = new Info();
        info.name = "Nobunaga";
        info.email = "nobunaga@gmail.com";

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(info);

        System.out.println(json);
    }
}
```

```:console
{"name":"Nobunaga","email":"nobunaga@gmail.com"}
```


#5. もっと便利に、使いまわせるようにする
以下のクラスを作成します。

```java:JsonUtil.java 
package com.fasterxml.jackson.core.jackson_core;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUtil {
     /**
     * JSON文字列をDTOクラスへ変換する
     * @param dto
     * @param json
     * @return DTOobject
     * @throws IOException
     */
     public static <T> T parse(Class<T> dto, String json){
          ObjectMapper mapper = new ObjectMapper();
          try{
               return (T) mapper.readValue(json, dto);
          }catch(IOException e){
               return null;
          }
     }
     /**
     * DTOクラスのインスタンスをJSON文字列に変換する
     * @param dto
     * @return String
     * @throws JsonProcessingException
     */
     public static String convert(Object dto){
          ObjectMapper mapper = new ObjectMapper();
          try{
               String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(dto);
               return json;
          }catch(JsonProcessingException e){
               return null;
          }
     }
}
```
##(1)parse()メソッド
このメソッドはJSONの文字列をJavaオブジェクトに変換しています。
引数の(Class<T> dto, String json)ではJavaオブジェクトのクラスと
変換したいJSON文字列を渡します。
引数に渡すものはどんなJavaオブジェクトでもJSON文字列でもよいので、
parse(Javaオブジェクト,JSON文字列)とすればJSON文字列からJavaオブジェクトに変換されて、Javaオブジェクトが返ってきます。

##(1)convert()メソッド
このメソッドは引数にJavaオブジェクトを渡すだけでJavaオブジェクトからJSON文字列を生成します。