刀科の技術学習ブログ

アプリサイドから、web系フロント・バックとAWSによるインフラ領域へ学習を進めていきます。

【続】Jsonマッパー 「jsonpullparser」つかってみた!

昨日の続きです。

使用するテストデータはこちら

そしてこれに対するパーサークラスが下記2つです。
PostMessageList

@JsonModel(decamelize=false)
public class PostMessageList {
    @JsonKey
    public List<TestJsonParse> postlist;

    public List<TestJsonParse> getPostlist() {
        return postlist;
    }

    public void setPostlist(List<TestJsonParse> postlist) {
        this.postlist = postlist;
    }
}

TestJsonParse

@JsonModel(decamelize=false)
public class TestJsonParse {
    @JsonKey
    public String id_postmessage;

    @JsonKey
    public String id_sender;

    public String getId_postmessage() {
        return id_postmessage;
    }
    public void setId_postmessage(String id_postmessage) {
        this.id_postmessage = id_postmessage;
    }

    public String getId_sender() {
        return id_sender;
    }
    public void setId_sender(String id_sender) {
        this.id_sender = id_sender;
    }
}

上記のクラスを定義して、
テストデータのInputStreamを生成できたら、下記のようにして読み込めばパース完了です。

JsonPullParser parser = JsonPullParser.newParser(in);
PostMessageList json = PostMessageListGen.get(parser);
Log.d("test",json.postlist.get(2).id_sender);

こんな感じでパースした内容を参照できます。


JsonPullParserはProGuardの難読化にも対応できるそうで、その点でも使いたいなーと思ってます。
難読化が出来る/出来ないについて、どういうことなのかよくわかってないので、
次回は難読化について調べてみます。

Jsonマッパー 「jsonpullparser」つかってみた!

以前に仕事のプロジェクトでJsonライブラリを使っていたことがある(※たしかjacksonだった)のですが、正直に言うと「マッパー?何それ?」ってくらいの認識で、メンバーの方が選定用意してくれたものをただ使ってるだけでした。
自作アプリ開発でも同じく楽をしようと思い、必要に駆られて何使おうか調べた結果、軽い早いのバランスでjsonpullparserを使っていこうと好みで選びました。

で、つい1週間程前に、後輩君が「JSON使ったことが無い!仕事で使うらしいんですけど助けて~!」って言ってたので、この機会に社内採用技術としてjsonpullparserを押してしまおうと企んでます。

使い方は上のリンクでも書かれてますが、coreとaptのJAR2つをプロジェクトに設定し、パーサークラスを用意・設定すればOK。

core.jarはAndroidプロジェクトのlibフォルダに配置するだけ。
apt.jarは、注釈処理設定と外部jarとしてパスを通して使います。

まずはjarの指定方法。
eclipseのメニュから「プロジェクト→プロパティ→Javaコンパイラー→注釈処理→ファクトリー・パス」に進んで、外部jarの追加からapt.jarを指定すればOK。

次にjar指定の途中にあった【注釈処理】で必要な設定をします。
【注釈処理】の設定画面にあるプロセッサー・オプションにKey・Valueを設定します。
設定するキーは2つ
 ・JsonPullParserClassPostfix  パーサークラスから自動生成するクラスにつける文字列
 ・JsonPullParserDebug     デバッグ出力の有無
JsonPullParserClassPostfixにはGenとか入れておけばいいです。
例えばパーサークラス「jjjson.java」があったとして、ビルド時に「jjjsonGen.java」という感じでクラス名の末尾にくっついてきます。
この【自動生成クラスの生成場所】は後で設定します。

JsonPullParserDebugは、名前にもあるようにデバッグ出力の有無ってことなので、必要に応じてtrue/falseで設定しましょう。

最後に【自動生成クラスの生成場所】の設定です。
Key・Value設定の真上に「生成されるソース・ディレクトリー」という項目があるので、ここに適当にパスを通せばいいです。
よくある設定はgenの直下に生成ってのが一般的っぽいので、./genとかしておくといいと思います。


テスト用のコードとデータは後日追加します。


【2016/03/12 追記】
AndroidStudioでは、簡単に導入ができます。

利点としては次の通りです。

  • JARファイルの設置不要
  • 【注釈処理】の設定不要(たぶん勝手にやってくれてるのかな)
  • 【自動生成クラスの生成場所】もgradleファイルに記述できる

次は肝心の設定方法。
プロジェクトとアプリのgradleに、apt処理のライブラリを追加する。

プロジェクトのgradle
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'  ←この部分に、お好みのapt処理してくれるものを追加する
    }

アプリのgradle
apply plugin: 'com.neenbedankt.android-apt'

アプリgradleに、vvakameさんのjsonpullparserを利用するための記述を追加する。

アプリのgradleの適所に追記する

android {
    compileOptions {
        encoding = "UTF-8"
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src-gen/main/java']  //←クラス出力先
        }
    }
}

ext.jppVersion = '1.6.+';
configurations {
    apt
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile "net.vvakame:jsonpullparser-core:${jppVersion}"       //←追加
    apt "net.vvakame:jsonpullparser-apt:${jppVersion}"                //←追加
}

gradleに設定するだけで、サクッと使えるようになります。Ecripse環境と比べるとすんごい楽です。
ビルドすると'src-gen/main/java'のパスに、自動生成のクラスが出力されるようになるかと。
便利なクラスを作ってくれたvvakameさんに感謝です!

開発ブログを書いてみる

と言うことで、これから細々と書いていってみます。
プライベート開発と平行なので、開発が進めば何か書くと思われ。

アプリについては触れませんが、実装した機能やハマリ所を恥らいつつも書き溜めていきます。
これも後進育成のため・・・。