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

  • 83
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

1. 概要

(1)Jacksonとは

  • Java用のJSONパーサーライブラリの1つ
  • 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サンプル

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

③JSONのメリット

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

(3)Jacksonで登場人物

①JSON文字列

{"nobunaga":1534,"hideyoshi":1537,"ieyasu":1543}

②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)書式

実行クラス
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)凡例

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);
     }
}
console
"Nobunaga"

4. Javaオブジェクト ⇒ JSON文字列

(1)書式

DTOクラス
public class DTOクラス {
    public String メンバ名1;
    public String メンバ名2;
}
実行クラス
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)凡例

Info.java
public class Info {
    public String name;
    public String email;
}
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. もっと便利に、使いまわせるようにする

以下のクラスを作成します。

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 dto, String json)ではJavaオブジェクトのクラスと
変換したいJSON文字列を渡します。
引数に渡すものはどんなJavaオブジェクトでもJSON文字列でもよいので、
parse(Javaオブジェクト,JSON文字列)とすればJSON文字列からJavaオブジェクトに変換されて、Javaオブジェクトが返ってきます。

(1)convert()メソッド

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