androidで使えるjson-javaライブラリ

49
Android でででで JSON-Java ででででで JSON ででででで でで 2012/7/13( で )

Upload: yukiya-nakagawa

Post on 12-Nov-2014

19.075 views

Category:

Technology


2 download

DESCRIPTION

JSON日の金曜日#1での発表です http://atnd.org/events/29927

TRANSCRIPT

Page 1: Androidで使えるJSON-Javaライブラリ

Android で使えるJSON-Java ライブラリ

JSON 日の金曜日 1週目2012/7/13( 金 )

Page 2: Androidで使えるJSON-Javaライブラリ

aboutme.json{

"name":"Yukiya Nakagawa","nick_name":" なかざん ","screen_name":"Nkzn","org":[

{"name":" ウォーターセル株式会社 ","activity":" 農業支援システム「アグリノート」 "

},{

"name":" 日本 Android の会 新潟支部 ","activity":" さいきんなにもやってない (´ ・ ω ・` )"

}]

}

Page 3: Androidで使えるJSON-Javaライブラリ

なぜ JSON×Android なのか?スマホと鯖と JavaScript の美味しい関係

Page 4: Androidで使えるJSON-Javaライブラリ

鯖と端末の関係

Page 5: Androidで使えるJSON-Javaライブラリ

鯖と端末の関係鯖だと思いねえ

データのやり取り

Page 6: Androidで使えるJSON-Javaライブラリ

「データ」• HTTP 通信でやり取りできるものの例– XML

• Java 系フレームワークの伝統と信頼• Android 向けの標準ライブラリでも豊富にサポート• Content-Type: application/xml

– 平文• 構造化とかどうでもいいとき• Content-Type: text/plain

– JSON• マルチプラットフォーム展開の強い味方• Content-Type: application/json

Page 7: Androidで使えるJSON-Javaライブラリ

マルチプラットフォーム展開鯖だと思いねえ

スマートフォンタブレット

Web アプリ

Page 8: Androidで使えるJSON-Javaライブラリ

Web アプリといえば

JavaScript

Page 9: Androidで使えるJSON-Javaライブラリ

マルチプラットフォーム展開鯖だと思いねえ

スマートフォンタブレット

Web アプリ

JSONXML

クライアントでの受け取りが楽!

Page 10: Androidで使えるJSON-Javaライブラリ

マルチプラットフォーム展開鯖だと思いねえ

スマートフォンタブレット

Web アプリ

JSONXML

2種類用意するの、無駄じゃね?

Page 11: Androidで使えるJSON-Javaライブラリ

マルチプラットフォーム展開鯖だと思いねえ

スマートフォンタブレット

Web アプリ

JSONXMLJSON゚ i ・。 i * i ゜ o・。 i ・。 i*。。 | o___・ | o゚ |・+ o /。゚ _ ノヽ _ *\゚ ・゚ i /・。 (≡)   (≡)\゚+。 | ゚ //// (_ 人 _) //∧ ゚*|   |┬ |  |・ i \_ 。 ` ー U  _/。*/ \゚ |   \ oノ ・゚ i | |     ̄ ̄ ⌒ヽo| |   /       |・ i ヽソ _ 人  /人  |゚。 /   /   ̄ ̄ / | |/      /  | |  | \∧MMM∧/ |< J S O N 状 態!>  | /VWWWV\ |

JSON

Page 12: Androidで使えるJSON-Javaライブラリ

JSON-Javaライブラリの役割Parse & Serialize

Page 13: Androidで使えるJSON-Javaライブラリ

JSON-Java ライブラリの役割• 最低限: JSON データが読めること• JSON 文字列と Java オブジェクト (POJO)

の相互変換– Java → JSON :シリアライズ– JSON → Java :パース(デシリアライズ)

Page 14: Androidで使えるJSON-Javaライブラリ

{ "name":"Yukiya Nakagawa”, "nick_name":" なかざん ", "screen_name":"Nkzn", "orgs":[ { "name":" ウォーターセル株式会社 ", "activity":" 農業支援システム「アグリノート」” }, { "name":" 日本 Android の会 新潟支部 ", "activity":" さいきんなにもやってない (´ ・ ω ・` )” } ]}

public class AboutMe { String name; String nickName; String screenName; List<Org> orgs; // getter-setter

class Org { String name; String activity; // getter-setter }}

AboutMe.java aboutme.json

パース

シリアライズ

POJO との相互変換

Page 15: Androidで使えるJSON-Javaライブラリ

POJO

• Plain Old Java Object– 「昔ながらの素朴な Java オブジェクト」– POJO 自体には命名規則はない– POJO の一種である JavaBeans の規約 / 命名

規則が流用される• public な引数なしコンストラクタ• いくつかのインスタンス変数• 上記に対応する getter/setter

– JavaBeans よりはゆるふわ

Page 16: Androidで使えるJSON-Javaライブラリ

Androidで使える JSONライブラリ

できるだけ頑張らない方向の

Page 17: Androidで使えるJSON-Javaライブラリ

Android で使える JSON ライブラリ

• 選定基準– 依存ライブラリがほぼないこと• 外部 jar が増えると Maven 使いたくなる• Maven と Android は相性悪め

– 使い方が分かりやすいこと• 独断と偏見

– Android に存在しない JavaAPI を使っていないこと• JavaVM じゃなくて DalvikVM だからね!• 基本的に気にしなくても問題ない

Page 18: Androidで使えるJSON-Javaライブラリ

Android で使える JSON ライブラリ

• org.json– Android SDK 標準搭載の JSON パーサー

• JSONIC (ver 1.2.11)– http://jsonic.sourceforge.jp/– JSP 連携とか強いらしい

• google-gson (ver 2.2.2)– http://code.google.com/p/google-gson/– グーメン

• JsonPullParser (ver 1.4.11)– https://github.com/vvakame/JsonPullParser– APT を利用する移植作– 軽量

Page 19: Androidで使えるJSON-Javaライブラリ

org.jsonAndroidSDK にも付いてる

Page 20: Androidで使えるJSON-Javaライブラリ

パース

Page 21: Androidで使えるJSON-Javaライブラリ

パース

Page 22: Androidで使えるJSON-Javaライブラリ

パース

Page 23: Androidで使えるJSON-Javaライブラリ

シリアライズ

Page 24: Androidで使えるJSON-Javaライブラリ

感想1. めんどい2. めんどい3. POJO 関係ねえ4. めんどい

Page 25: Androidで使えるJSON-Javaライブラリ

JSONICいたれりつくせり

Page 26: Androidで使えるJSON-Javaライブラリ

JSONIC

• 特徴– POJO⇔JSON 変換– 対応している型の数がなんかすごい– JavaScript に親和的な出力• JSP 内で JS 用に JSON を出力する場合とか• エスケープかけてくれたり

– XML→JSON 変換• (org.w3c.dom.Document/Element を経由 )

Page 27: Androidで使えるJSON-Javaライブラリ

パース

Page 28: Androidで使えるJSON-Javaライブラリ

シリアライズ

Page 29: Androidで使えるJSON-Javaライブラリ

感想1. jar 1個にパス通したら使えた便利2. 基本的に1行でなんとかなる便3. JSONObject とは一体なんだったのか

Page 30: Androidで使えるJSON-Javaライブラリ

google-gson信仰が貴方の力となる ―― グーメン

Page 31: Androidで使えるJSON-Javaライブラリ

google-gson

• 特徴– POJO⇔JSON 変換– 字句解析機能も備えているため

org.json.JSONObject のような真似も可能– 速さにムラがあるらしい(後述)

Page 32: Androidで使えるJSON-Javaライブラリ

パース

Page 33: Androidで使えるJSON-Javaライブラリ

シリアライズ

Page 34: Androidで使えるJSON-Javaライブラリ

感想1. JSONIC触った後だと「シリアライズ時

の型くらい自分で分かれよ」と思わなくもない

2. jar1 個にパス通すだけでいいのはやはり楽

Page 35: Androidで使えるJSON-Javaライブラリ

JsonPullParserすごいぞぼくらの JPP !

作者@vvakame( ジェイソン仕様 )

Page 36: Androidで使えるJSON-Javaライブラリ

特徴• APT(Annotation Processing Tool) を利用して

いる– アノテーションに応じてクラスの自動生成とか出来る– 詳しくはこのへん

• http://www.slideshare.net/vvakame/apt-7568357

• 各 POJO に応じた JSON パーサーを自動生成• 軽量– JSONIC 208KB– gson: 184KB– JPP: 45KB

Page 37: Androidで使えるJSON-Javaライブラリ

パース

Page 38: Androidで使えるJSON-Javaライブラリ

シリアライズ

Page 39: Androidで使えるJSON-Javaライブラリ

感想1. いつもアグリノート内でお世話になっていま

す2. 正直アノテーション付けるの面倒臭いときあ

る– でもお陰で型安全になってる部分ある

3. 割と作るのが簡単な TokenConverter を実装すれば Java の型に1対1対応できない値が来ても大丈夫!– 文字列値が来るか配列が来るか分からないキーの

ための「 String2ListConverter」作りました。

Page 40: Androidで使えるJSON-Javaライブラリ

総括ぶっちゃけた話

Page 41: Androidで使えるJSON-Javaライブラリ

ぶっちゃけ org.json のやつ以外は好みじゃね?

Page 42: Androidで使えるJSON-Javaライブラリ

使い分け• 1 Entry per Day: Android アプリで使え

る JSON ライブラリ比較– http://mstssk.blogspot.jp/2011/12/

androidjson.html–ぶっちゃけ今回の発表はここの記事参考にし

ただけです。–色んなパフォーマンス計測結果が出てます。–次ページで特徴に合わせた使い分けをば。

Page 43: Androidで使えるJSON-Javaライブラリ

それぞれの特徴• JSONIC– ゆるふわな使い勝手と引換にファイルも動作

も重い• google-gson– パースは超速いけどシリアライズは遅い

• JsonPullParser–専用クラスを生成した恩恵で安定のスピード

Page 44: Androidで使えるJSON-Javaライブラリ

それぞれの特徴からみた使い道

• JSONIC– とにかくすぐ使いたい&そこまで速度は求め

てないとき• google-gson– パースしかする予定がないとき

• JsonPullParser– 本体を重くしたくない時

Page 45: Androidで使えるJSON-Javaライブラリ

Android特有の悩みProguard

Page 46: Androidで使えるJSON-Javaライブラリ

セキュリティ問題• Android のリバースエンジニアリング手法は既に確立している

• そのままリリースすると Java ファイルまで丸見え

• ソースコード難読化という足止めが必要• 標準難読化ツール「 Proguard 」との相

性は重要となる

Page 47: Androidで使えるJSON-Javaライブラリ

Proguard との相性

• JPP以外は基本的にアウト– 変数名と JSON 内のキーの対応が重要–難読化すると変数名が変わってしまう• 逆に POJO を難読化しなければ行ける

– JPP は POJO専用クラスを生成して、難読化前に内部でキー名と変数の対応が出来上がっているため、難読化の影響を受けない

難読化に強いのは JPP !

Page 48: Androidで使えるJSON-Javaライブラリ

結論Stealth Marketing

Page 49: Androidで使えるJSON-Javaライブラリ

みんな JPP つかおうぜ

って言えって言われました