爲Android項目配置Kotlin後,我寫了一個簡單的MainActivity.kt
。它呼籲改造獲得其中載有下列數據的JSON文件:Moshi的定製適配器與RxAndroid&Retrofit&Kotlin
{ "message": "success", "user": { "username": "Eric" } }
現在我想用磨石的JSON數據轉換爲科特林的課,所以這裏有兩個班,以反映上述JSON結構:
class User(var username: String) class UserJson(var message: String, var user: User)
而對於莫希自定義類型的適配器:
class UserAdapter { @FromJson fun fromJson(userJson: UserJson) : User { Log.d("MyLog", "message = ${userJson.message}") // = success Log.d("MyLog", "user = ${userJson.user}") // = null return userJson.user } }
當它進入功能fromJson()
,userJson.message = "success"
預期。但奇怪的是,userJson.user
是null
,應該是User(username="Eric")
。
我是Moshi和Kotlin的新手,我已經堅持了約10個小時的這個問題。請幫助我。謝謝你的幫助。
========================================
以下是的MainActivity.kt
(僅50行)的完整代碼:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Custom Type Adapters for Moshi val userMoshi = Moshi.Builder().add(UserAdapter()).build() val retrofit = Retrofit.Builder() .baseUrl("https://dl.dropboxusercontent.com/") .addConverterFactory(MoshiConverterFactory.create(userMoshi)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build() val accountService = retrofit.create(AccountService::class.java) accountService.signUpAnonymously() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { user -> Log.d("MyLog", user.toString()) } } } // ========== For Retrofit ========== interface AccountService { @GET("u/17350105/test.json") fun signUpAnonymously() : Observable<User> } // ========== For Moshi ========== class User(var username: String) class UserJson(var message: String, var user: User) class UserAdapter { @FromJson fun fromJson(userJson: UserJson) : User { Log.d("MyLog", "message = ${userJson.message}") // = success Log.d("MyLog", "user = ${userJson.user}") // = null return userJson.user } }
的build.gradle
是:
compile "io.reactivex.rxjava2:rxjava:2.0.0" compile "io.reactivex.rxjava2:rxandroid:2.0.0" compile "com.android.support:appcompat-v7:25.0.0" compile "com.squareup.retrofit2:retrofit:2.1.0" compile "com.squareup.retrofit2:converter-moshi:2.1.0" compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
再次感謝您。
它的工作原理,謝謝!我還有一個問題:有沒有更好的方法來實現相同的目標? (我唯一需要做的就是從原始的JSON中獲取'user'字段。) – iForests