2017.8.21
Androidアプリ開発日誌#6【Google Map#5-GSON-】
前回苦節の果てに辿り着いたのが
GSONというライブラリでしたね。
で、とりあえずコードが動いたので、全部載せます。
あっ、結論から言うと
僕の書いたJSONが間違ってたみたいです()
とりあえず正解のJSONモックデータをばん。
class Mock {
companion object {
const val testjson="{\n" +
" \"Datas\": [\n" +
" {\n" +
" \"Id\": 1,\n" +
" \"name\": \"都庁\",\n" +
" \"lat\": 34.745818,\n" +
" \"lng\": 134.869133,\n" +
" \"price\": 1000,\n" +
" \"text\": \"都庁。我々横浜県民には無縁の場所である。\"\n" +
" },\n" +
" {\n" +
" \"Id\": 2,\n" +
" \"name\": \"東加古川駅\",\n" +
" \"lat\": 35.689605,\n" +
" \"lng\": 139.692316,\n" +
" \"price\": 2500,\n" +
" \"text\": \"ろんぐさんのかつての最寄り駅だよ。\n\n実家は引っ越した。\"\n" +
" },\n" +
" {\n" +
" \"Id\": 3," +
" \"name\": \"さいたま市役所\",\n" +
" \"lat\": 35.883814,\n" +
" \"lng\": 139.626178,\n" +
" \"price\": 500,\n" +
" \"text\": \"埼玉なら500円でええやろwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\"\n" +
" }\n" +
" ]\n" +
"}"
}
}
これが実際に動くJSONです。違いはよくわかんないですけど、JSONを手打ちで打つことの方が少ないので原因解明は諦めます。(笑)
で、次にGSONですね。
まずGSONをインポートしますかね。
dependencies {
compile 'com.google.code.gson:gson:2.3.1'
}
以上。これで自動コンパイルされます。いやーらくちんらくちん。GitHubほんと使いやすいなぁ。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//ここからJSON
val jsonObj = Gson().fromJson(Mock.testjson, JsonObject::class.java) as JsonObject
val jsonAry = jsonObj.get("Datas").asJsonArray
//表示部
for(j in jsonAry) {
Log.v("AAAA:", j.toString())
}
//forEachパターン
jsonAry.forEach { Log.v("BBBB:", it.toString()) }
//val ary = jsonAry.get(0).toString()//決め打ちで取得しようとしたらこんな感じ。
}
いろんなパターンを試してますが、イテレーションでざっと取得するところまでは動作確認しました。
これ書いてる過程で知ったんですけど、Kotlinって
for(int i;i<n;i++){}っていう記法が
存在しないんですね。どの言語にもある構造だったので使えなくてびっくりしました。
基本的にKotlinでは
for(i in obj)っていう書き方でforループを実装するそうです。
まぁこれだったら基本forEachで一行でラムダ書けますよねっていうことでforEachも試してみました。
とりあえずJsonObject型の配列を取ってきて、ごにょごにょすればいいのだな!!
んじゃ、もう少し汎用性を持たせるために各パラメータにアクセスしてみましょ。
val jsonObj = Gson().fromJson(Mock.testjson, JsonObject::class.java) as JsonObject
val jsonAry = jsonObj.get("Datas").asJsonArray
jsonAry.forEach{
val obj = it.getAsJsonObject();
Log.v("debug_id:", obj.get("Id").getAsNumber().toString())
Log.v("debug_name:", obj.get("name").getAsString())
Log.v("debug_lat:", obj.get("lat").getAsDouble().toString())
Log.v("debug_lng:", obj.get("lng").getAsDouble().toString())
Log.v("debug_price:", obj.get("price").getAsNumber().toString())
Log.v("debug_text:", obj.get("text").getAsString())
}
まずJsonArrayとかいう配列を生成し、それをそれぞれオブジェクトに変換してアクセスするみたいです。配列の中身にダイレクトにアクセスすることはできませんでした。(笑)
オブジェクトにしちゃえばなんでもgetできるので、適切な形で受け取ります。今回はログに表示させるだけなので全部Stringに変換しちゃってますけど・・・・・・。笑
とりあえず、ここまで出来たら、サーバーと情報のやりとりはできそーですね。
最後にマーカーに結びつけましょうか。
ついに!!!第一関門突破ですね!!!(・∀・)笑
これができれば後はいかようにもできます。プロトタイプなのでGUIとかはあんま気にしない方向で行きましょう。
ハマるとそこで一気にやる気がなくなります。
ついでにコードも載せますか。
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
// Add a marker in Sydney and move the camera
val jsonObj = Gson().fromJson(Mock.testjson, JsonObject::class.java) as JsonObject
val jsonAry = jsonObj.get("Datas").asJsonArray
jsonAry.forEach{
val obj = it.getAsJsonObject();
mMap!!.addMarker(
MarkerOptions()
.position(LatLng(obj.get("lat").getAsDouble(),obj.get("lng").getAsDouble()))
.title(obj.get("text").getAsString())
)
}
val sydney = LatLng(35.689605, 139.692316)
mMap!!.moveCamera(CameraUpdateFactory.newLatLng(sydney))
}
カメラ位置はめんどいのでシドニーそのまま使います笑
最初からもーちょい拡大とかできても良かったんですけどね。
さて、今後の予定ですが、システム的に未知の領域であったGoogleMapは必要最低限扱えるようになったかと思います。
画面遷移に関してはまだ簡単なメモしか残していないので、もう少し詳細な図を書いて、作るべきシステムの輪郭をはっきりさせましょーかね。
ちなみに、見てわかる通り、作ろうとしてるのは宿泊システムです。(笑)
まぁ「どんな」とは完全に答えになるので今は言いませんけど(笑)、ビジネス的にこれが成功できるかどうかは正直僕自身懐疑的なんですよね。勝算がないこともないんですけど、それが一般的に受け入れてもらえるかどうかなんてわかんないですからね。
Twitterとかも最初のうちは細々としたサービスだったみたいですしね。得てしてそーいうものです。ですので、なるべく融資でなく投資を受ける方向で行けばリスクも少ないかなーと。
こういうインターネットアプリケーションはスタートに必要な額が少額なので、そこを活かしてなるべくリスク回避しつつ、可能性を見てもらえる人に広告費と開発費を投資してもらえないかなっていう。
もちろん、商品の魅力を伝える努力はしますし、これが「次につながる」こともアピールしたいと思っています。
つまり僕のプランはこれで終わりじゃないんですよ。
失敗したとしても次なる一手までは現状準備できています。もちろんどこからも投資が受けられなかったら生活できないんですけど、まぁ1年分の家賃ぐらいは持ってるんで、無職による税金回避と覆面調査の細々とした収入を合わせれば1年ぐらいは延命できるので頑張ります(笑)
借りてる金返さなきゃいけない親に、このこといつ言おうかな・・・・・・笑