androidで使えるjson-javaライブラリ
DESCRIPTION
JSON日の金曜日#1での発表です http://atnd.org/events/29927TRANSCRIPT
Android で使えるJSON-Java ライブラリ
JSON 日の金曜日 1週目2012/7/13( 金 )
aboutme.json{
"name":"Yukiya Nakagawa","nick_name":" なかざん ","screen_name":"Nkzn","org":[
{"name":" ウォーターセル株式会社 ","activity":" 農業支援システム「アグリノート」 "
},{
"name":" 日本 Android の会 新潟支部 ","activity":" さいきんなにもやってない (´ ・ ω ・` )"
}]
}
なぜ JSON×Android なのか?スマホと鯖と JavaScript の美味しい関係
鯖と端末の関係
鯖と端末の関係鯖だと思いねえ
データのやり取り
「データ」• HTTP 通信でやり取りできるものの例– XML
• Java 系フレームワークの伝統と信頼• Android 向けの標準ライブラリでも豊富にサポート• Content-Type: application/xml
– 平文• 構造化とかどうでもいいとき• Content-Type: text/plain
– JSON• マルチプラットフォーム展開の強い味方• Content-Type: application/json
マルチプラットフォーム展開鯖だと思いねえ
スマートフォンタブレット
Web アプリ
Web アプリといえば
JavaScript
マルチプラットフォーム展開鯖だと思いねえ
スマートフォンタブレット
Web アプリ
JSONXML
クライアントでの受け取りが楽!
マルチプラットフォーム展開鯖だと思いねえ
スマートフォンタブレット
Web アプリ
JSONXML
2種類用意するの、無駄じゃね?
マルチプラットフォーム展開鯖だと思いねえ
スマートフォンタブレット
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
JSON-Javaライブラリの役割Parse & Serialize
JSON-Java ライブラリの役割• 最低限: JSON データが読めること• JSON 文字列と Java オブジェクト (POJO)
の相互変換– Java → JSON :シリアライズ– 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 との相互変換
POJO
• Plain Old Java Object– 「昔ながらの素朴な Java オブジェクト」– POJO 自体には命名規則はない– POJO の一種である JavaBeans の規約 / 命名
規則が流用される• public な引数なしコンストラクタ• いくつかのインスタンス変数• 上記に対応する getter/setter
– JavaBeans よりはゆるふわ
Androidで使える JSONライブラリ
できるだけ頑張らない方向の
Android で使える JSON ライブラリ
• 選定基準– 依存ライブラリがほぼないこと• 外部 jar が増えると Maven 使いたくなる• Maven と Android は相性悪め
– 使い方が分かりやすいこと• 独断と偏見
– Android に存在しない JavaAPI を使っていないこと• JavaVM じゃなくて DalvikVM だからね!• 基本的に気にしなくても問題ない
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 を利用する移植作– 軽量
org.jsonAndroidSDK にも付いてる
パース
パース
パース
シリアライズ
感想1. めんどい2. めんどい3. POJO 関係ねえ4. めんどい
JSONICいたれりつくせり
JSONIC
• 特徴– POJO⇔JSON 変換– 対応している型の数がなんかすごい– JavaScript に親和的な出力• JSP 内で JS 用に JSON を出力する場合とか• エスケープかけてくれたり
– XML→JSON 変換• (org.w3c.dom.Document/Element を経由 )
パース
シリアライズ
感想1. jar 1個にパス通したら使えた便利2. 基本的に1行でなんとかなる便3. JSONObject とは一体なんだったのか
google-gson信仰が貴方の力となる ―― グーメン
google-gson
• 特徴– POJO⇔JSON 変換– 字句解析機能も備えているため
org.json.JSONObject のような真似も可能– 速さにムラがあるらしい(後述)
パース
シリアライズ
感想1. JSONIC触った後だと「シリアライズ時
の型くらい自分で分かれよ」と思わなくもない
2. jar1 個にパス通すだけでいいのはやはり楽
JsonPullParserすごいぞぼくらの JPP !
作者@vvakame( ジェイソン仕様 )
特徴• APT(Annotation Processing Tool) を利用して
いる– アノテーションに応じてクラスの自動生成とか出来る– 詳しくはこのへん
• http://www.slideshare.net/vvakame/apt-7568357
• 各 POJO に応じた JSON パーサーを自動生成• 軽量– JSONIC 208KB– gson: 184KB– JPP: 45KB
パース
シリアライズ
感想1. いつもアグリノート内でお世話になっていま
す2. 正直アノテーション付けるの面倒臭いときあ
る– でもお陰で型安全になってる部分ある
3. 割と作るのが簡単な TokenConverter を実装すれば Java の型に1対1対応できない値が来ても大丈夫!– 文字列値が来るか配列が来るか分からないキーの
ための「 String2ListConverter」作りました。
総括ぶっちゃけた話
ぶっちゃけ org.json のやつ以外は好みじゃね?
使い分け• 1 Entry per Day: Android アプリで使え
る JSON ライブラリ比較– http://mstssk.blogspot.jp/2011/12/
androidjson.html–ぶっちゃけ今回の発表はここの記事参考にし
ただけです。–色んなパフォーマンス計測結果が出てます。–次ページで特徴に合わせた使い分けをば。
それぞれの特徴• JSONIC– ゆるふわな使い勝手と引換にファイルも動作
も重い• google-gson– パースは超速いけどシリアライズは遅い
• JsonPullParser–専用クラスを生成した恩恵で安定のスピード
それぞれの特徴からみた使い道
• JSONIC– とにかくすぐ使いたい&そこまで速度は求め
てないとき• google-gson– パースしかする予定がないとき
• JsonPullParser– 本体を重くしたくない時
Android特有の悩みProguard
セキュリティ問題• Android のリバースエンジニアリング手法は既に確立している
• そのままリリースすると Java ファイルまで丸見え
• ソースコード難読化という足止めが必要• 標準難読化ツール「 Proguard 」との相
性は重要となる
Proguard との相性
• JPP以外は基本的にアウト– 変数名と JSON 内のキーの対応が重要–難読化すると変数名が変わってしまう• 逆に POJO を難読化しなければ行ける
– JPP は POJO専用クラスを生成して、難読化前に内部でキー名と変数の対応が出来上がっているため、難読化の影響を受けない
難読化に強いのは JPP !
結論Stealth Marketing
みんな JPP つかおうぜ
って言えって言われました