

環境：kotlin 1.2.51 / gson 2.4 / okhttp 3.10 retrofit 2.4

RetrofitとokhttpでWebAPIからjsonデータを取得しconverterでdata classに格納しています。  
debug/releaseモードではdata classのメンバに正常に格納されるのですが、Android StudioのGenerate Signed
APKで署名したAPKだと正常に格納されません。

以下、コードを記載します。

[code]

    class ServiceGenerator {
    companion object {
        fun create(auth: Boolean = false) : Router {
            val client = httpClientBuilder(auth)
            val gson = GsonBuilder()
                            .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                            .create()
            val adapter = RxJava2CallAdapterFactory.createAsync()
    
            val baseUrl = LocalConfigManager.getProperty(ConfigConstants.KEY_BASE_URL)
            return Retrofit.Builder()
                    .baseUrl(baseUrl!!)
                    .addCallAdapterFactory(adapter)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .client(client)
                    .build()
                    .create(Router::class.java)
        }
    
        private fun httpClientBuilder(auth: Boolean): OkHttpClient {
            val client = OkHttpClient.Builder()
            client.addNetworkInterceptor(HeaderInterceptor())
            if (auth)
                client.addNetworkInterceptor(AuthorizationHeaderInterceptor())
            client.protocols(Arrays.asList(Protocol.HTTP_1_1))
    
            if (BuildConfig.DEBUG) {
                val logger = HttpLoggingInterceptor()
                //logger.level = HttpLoggingInterceptor.Level.HEADERS
                logger.level = HttpLoggingInterceptor.Level.BODY
                client.addNetworkInterceptor(logger)
            }
            return client.build()
        }
    }
    
    interface Router {
        @GET("/api/v2/settings")
        fun settings() : Observable<Response<Foo>>
    }
    
    data class Settings(val version: Int, @SerializedName("settings") val details: Setting)
    data class Setting(
        val categories: List<Category> = listOf(),
        val personalEntries: List<PersonalEntry>)
    
[/code]

呼び出し元

[code]

    ServiceGenerator
                .create()
                .beaconContents()
                .compose(bindToLifecycle())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        {
                            if (it.isSuccessful){
                                it.body()?.let { data ->
                                    Log.d(TAG, Integer.toString(data.version)) <= 署名APKでは0になる。debug/releaseモードでは2になる。
                                    if (data.beaconContents == null) <=署名APKではnullになる。署名APKではデータが配列で格納される。
                                        Log.e(TAG, "beacon contents is null.")
    
                                    contentModel?.save(data.beaconContents)
                                }
                            }else{
                                when(it.code()){
                                    404 -> Log.e(TAG, "not found.")
                                }
                            }
                        },
                        {
                            Log.e(TAG, it.localizedMessage)
                        })
    
[/code]

APIで取得されたjsonデータ

[code]

    {"version":2,"settings":{"categories":[{"id":1,"disp_no":1," ..... }
    
[/code]

上記のコード中、呼び出し元のsubscribe内でログを出すと署名APKではversion==0にcategories==nullになります。

同じような経験された方で、解決方法をご存知の方いらっしゃいますか？


CC BY-SA 4.0
2018-07-27T02:56:42.880
47009
2018-07-27T03:16:19.077
29483
question
android kotlin retrofit
署名したAPKでgsonによるパースが行なえない


解決しました。  
コードの圧縮を有効にしていたのが原因でした。@SerializedNameを指定することで正常にパースすることが出来ました。


CC BY-SA 4.0
2018-07-27T03:16:19.077
47010
2018-07-27T03:16:19.077
29483
47009
answer