質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

3649閲覧

KotlinでJsonをパースするのに時間が掛かりすぎて困っています

HAL316

総合スコア16

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

1クリップ

投稿2017/12/19 09:56

###前提
サーバとWebAPIでやり取りするAndroidアプリを作るにあたって必要なJsonのパースについての質問です。
パースした後にViewに詰め込んで表示してみたのですが、想定していたより表示されるタイミングが数秒遅くて原因を調べるためにパースの部分だけを切り出してみました。
Jsonはコードの中に直接書き込んでありますが、この程度のJsonでもパース(或いは初期化)に時間がかかるものなのでしょうか?
使い方がおかしいのでしょうか?
二度連続して同じjsonをパースすると二度目は10ミリ秒程度でした。

  • ZTE Blade V7Lite(Android6.0)で3000ミリ秒前後
  • X06HT HTC Desire(Android4.4.1)で6000ミリ秒前後
  • Genymotion Google Pixel(Android7.1.0)で600ミリ秒前後

###Logcat

12-19 18:05:30.946 17683-17683/jackson.sample D/MainActivity: START 12-19 18:05:33.781 17683-17683/jackson.sample D/MainActivity: END 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: 掛かった時間: 2835 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Satoshi. 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Ken. 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Yoppy. 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Satoshi. 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Ken. 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Yoppy. 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Satoshi. 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Ken. 12-19 18:05:33.782 17683-17683/jackson.sample D/MainActivity: My name is Yoppy.

###build.gradle (Module: app)

dependencies { // 追記してSync済み compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.0" }

###MainActivity.kt

kotlin

1package jackson.sample 2 3import android.os.Bundle 4import android.support.v7.app.AppCompatActivity 5import android.util.Log 6import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper 7import com.fasterxml.jackson.module.kotlin.readValue 8 9class MainActivity : AppCompatActivity() { 10 11 val json = """ 12{ 13 "info": { 14 "total": 9 15 }, 16 "posts": [ 17 { 18 "id": 1, 19 "body": "Hello", 20 "author": { 21 "id": 1, 22 "name": "Satoshi", 23 "profile": { 24 "body": "My name is Satoshi." 25 } 26 } 27 }, 28 { 29 "id": 2, 30 "body": "Hello", 31 "author": { 32 "id": 2, 33 "name": "Ken", 34 "profile": { 35 "body": "My name is Ken." 36 } 37 } 38 }, 39 { 40 "id": 3, 41 "body": "Hello", 42 "author": { 43 "id": 3, 44 "name": "Yoppy", 45 "profile": { 46 "body": "My name is Yoppy." 47 } 48 } 49 }, 50 { 51 "id": 11, 52 "body": "Hello", 53 "author": { 54 "id": 1, 55 "name": "Satoshi", 56 "profile": { 57 "body": "My name is Satoshi." 58 } 59 } 60 }, 61 { 62 "id": 12, 63 "body": "Hello", 64 "author": { 65 "id": 2, 66 "name": "Ken", 67 "profile": { 68 "body": "My name is Ken." 69 } 70 } 71 }, 72 { 73 "id": 13, 74 "body": "Hello", 75 "author": { 76 "id": 3, 77 "name": "Yoppy", 78 "profile": { 79 "body": "My name is Yoppy." 80 } 81 } 82 }, 83 { 84 "id": 21, 85 "body": "Hello", 86 "author": { 87 "id": 1, 88 "name": "Satoshi", 89 "profile": { 90 "body": "My name is Satoshi." 91 } 92 } 93 }, 94 { 95 "id": 22, 96 "body": "Hello", 97 "author": { 98 "id": 2, 99 "name": "Ken", 100 "profile": { 101 "body": "My name is Ken." 102 } 103 } 104 }, 105 { 106 "id": 23, 107 "body": "Hello", 108 "author": { 109 "id": 3, 110 "name": "Yoppy", 111 "profile": { 112 "body": "My name is Yoppy." 113 } 114 } 115 } 116 ] 117} 118""" 119 120 override fun onCreate(savedInstanceState: Bundle?) { 121 super.onCreate(savedInstanceState) 122 setContentView(R.layout.activity_main) 123 } 124 125 override fun onResume() { 126 super.onResume() 127 parseJson(json) 128 } 129 130 private fun parseJson(json: String) { 131 Log.d(TAG, "START") 132 val start: Long = System.currentTimeMillis() 133 val result = mapper.readValue<PostsResult>(json) 134 val end: Long = System.currentTimeMillis() 135 Log.d(TAG, "END") 136 val interval = end - start 137 Log.d(TAG, "掛かった時間: " + interval.toString()) 138 result.posts?.let { posts -> 139 for (post in posts) { 140 Log.d(TAG, post.author!!.profile!!.body) 141 } 142 } 143 } 144 145 companion object { 146 val TAG = MainActivity::class.java.simpleName 147 val mapper = jacksonObjectMapper() 148 } 149}

###Model.kt

kotlin

1package jackson.sample 2 3data class PostsResult(val info: Info, val posts: List<Post>?) { 4 data class Info(val total: Int) 5} 6data class Post(val id: Int?, val author: Author?, val body: String?) 7data class Author(val id: Int?, val name: String?, val profile: Profile?) 8data class Profile(val body: String?)

###試したこと

  • jacksonObjectMapper()をcompanion objectではなく使用する直前に変えた -> 変わらず
  • パースを二度連続してやってみた -> 二度目は速い
  • data classでnullableを使っているので遅いのかと思い、?を取ってみた -> 変わらず

###補足情報(言語/FW/ツール等のバージョンなど)

  • Kotlin
  • Android Studio3.0.1
  • FasterXML/jackson-module-kotlin
  • 機種:ZTE BLADE V7Lite, Desire HTC X06HT, Genymotion Google Pixel

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決とは言えないかもしれませんが、Jacksonの使用をやめ、Gsonを使うことにしました。
Jacksonの使い方が間違っていただけ or 用途違いかもしれませんが、Gsonを使うことで想定内の時間でパースできました。

githubのissueでも同じように初回パースが極めて遅いことへの言及がありました。
First initialization jacksonObjectMapper() and first parse of .readValue is quite slow #69
https://github.com/FasterXML/jackson-module-kotlin/issues/69

投稿2017/12/25 03:26

HAL316

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問