Moshi的定制适配器,带有RxAndroid和Retrofit&Kotlin

Moshi的定制适配器,带有RxAndroid和Retrofit&Kotlin,第1张

概述在为 Android项目配置Kotlin之后,我编写了一个简单的MainActivity.kt.它调用Retrofit来获取包含以下数据的JSON文件: { "message": "success", "user": { "username": "Eric" }} 现在我想使用Moshi将JSON数据转换为Kotlin的类,所以这里有两个类来反映上面的 在为 Android项目配置Kotlin之后,我编写了一个简单的MainActivity.kt.它调用Retrofit来获取包含以下数据的JsON文件:

{    "message": "success","user": {        "username": "Eric"    }}

现在我想使用moshi将JsON数据转换为Kotlin的类,所以这里有两个类来反映上面的JsON结构:

class User(var username: String)class Userjson(var message: String,var user: User)

和moshi的自定义类型适配器

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'

再次感谢你.

解决方法 您可以通过更改代码来执行以下 *** 作来解决问题.

基本上在你注册UserAdapter的情况下,它告诉moshi它只能从Userjson对象创建一个User.因此,moshi无法识别带有关键字user的JsON对象.

通过以User1的形式添加间接(请原谅命名约定),使用JsON中的User1正确创建Userjson.

class User(var username: String)class User1(var username: String) // I introduced this classclass Userjson(var message: String,var user: User1) // changed User to User1class UserAdapter {    @FromJson fun fromJson(userjson: Userjson): User {        println("message = ${userjson.message}")                println("user = ${userjson.user}")                      return User(userjson.user.username)    }}
总结

以上是内存溢出为你收集整理的Moshi的定制适配器,带有RxAndroid和Retrofit&Kotlin全部内容,希望文章能够帮你解决Moshi的定制适配器,带有RxAndroid和Retrofit&Kotlin所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1122552.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存