在为 Android 项目配置 Kotlin 之后,我写了一个简单的 MainActivity.kt 。它调用Retrofit以获取包含以下数据的JSON文件:

{
"message": "成功",
“用户”:{
“用户名”:“埃里克”
}
}

现在想用Moshi把JSON数据转换成Kotlin的类,所以这里有两个类来反射(reflect)上面的JSON结构:

类用户(var 用户名:字符串)

class UserJson(var message: String, var user: User)

还有一个用于Moshi的自定义类型适配器:

类用户适配器{
@FromJson fun fromJson(userJson: UserJson) : User {
Log.d("MyLog", "message = ${userJson.message}")//= 成功
Log.d("MyLog", "user = ${userJson.user}")//= null

返回 userJson.user
}
}

当它进入函数 fromJson() 时, userJson.message = "success" 如预期的那样。但奇怪的是 userJson.usernull ,应该是 User(username="Eric")

我是 Moshi 和 Kotlin 的新手,我已经被这个问题困扰了大约 10 个小时。请帮帮我。谢谢你的帮助。

========================================

以下是MainActivity.kt的完整代码(仅50行):

MainActivity类:AppCompatActivity(){

覆盖 fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

//Moshi 的自定义类型适配器
val userMoshi = Moshi.Builder().add(UserAdapter()).build()

val 改造 = Retrofit.Builder()
.baseUrl("https://dl.dropboxusercontent.com/")
.addConverterFactory(MoshiConverterFactory.create(userMoshi))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
。 build ()

val accountService = retrofit.create(AccountService::class.java)

accountService.signUpAnonymous()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { 用户 ->
Log.d("MyLog", user.toString())
}
}
}

//========== 用于改造 ==========
接口(interface)帐户服务{

@GET("u/17350105/test.json")
有趣的signUpAnonymously():Observable

}

//========== 对于莫西 ==========
类用户(var 用户名:字符串)

class UserJson(var message: String, var user: User)

类用户适配器{

@FromJson fun fromJson(userJson: UserJson) : User {
Log.d("MyLog", "message = ${userJson.message}")//= 成功
Log.d("MyLog", "user = ${userJson.user}")//= null

返回 userJson.user
}

}
build.gradle 是:

编译“io.reactivex.rxjava2:rxjava:2.0.0”
编译“io.reactivex.rxjava2:rxandroid:2.0.0”

编译“com.android.support:appcompat-v7:25.0.0”

编译“com.squareup.retrofit2:retrofit:2.1.0”
编译“com.squareup.retrofit2:converter-moshi:2.1.0”
编译'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

再次感谢你。

最佳答案

您可以通过更改代码以执行以下操作来解决问题。

基本上在您注册 UserAdapter 的情况下,它告诉 moshi 它只能从 User 对象创建 UserJson。因此 Moshi 无法识别带有关键字 user 的 JSON 对象。

通过以 User1 的形式添加一个间接引用(请原谅命名约定),UserJson 是使用来自 JSON 的 User1 正确创建的。

class User(var username: String)

class User1(var username: String) // I introduced this class
class UserJson(var message: String, var user: User1) // changed User to User1

class UserAdapter {
    @FromJson fun fromJson(userJson: UserJson): User {
        println("message = ${userJson.message}")
        println("user = ${userJson.user}")
        return User(userJson.user.username)
    }
}

关于android - 带有 RxAndroid & Retrofit 和 Kotlin 的 Moshi 自定义适配器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40427317/

10-09 04:06