iFo*_*sts 7 android kotlin rx-java moshi retrofit2
在为 Android 项目配置 Kotlin 之后,我写了一个简单的MainActivity.kt. 它调用 Retrofit 来获取包含以下数据的 JSON 文件:
{
"message": "成功",
“用户”:{
“用户名”:“埃里克”
}
}
现在想用Moshi把JSON数据转换成Kotlin的类,所以这里有两个类来反映上面的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.user就是null,这应该是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())
。建造()
val accountService = retrofit.create(AccountService::class.java)
accountService.signUpAnonymous()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { 用户 ->
Log.d("MyLog", user.toString())
}
}
}
// ========== 用于改造 ==========
接口帐户服务{
@GET("u/17350105/test.json")
有趣的 signUpAnonymously() : Observable<User>
}
// ========== 对于莫西 ==========
类用户(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 它可以创建一个Useronly fromUserJson对象。因此 Moshi 无法识别带有关键字 的 JSON 对象user。
通过以User1( 请原谅命名约定) 的形式添加间接UserJson,User1从 JSON正确创建。
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)
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只需要User对象。有一个名为Moshi-Lazy-Adapters的库,它提供了一个@Wrapped注释,允许指定所需对象的路径。您所要做的就是将相应的适配器添加到您的 Moshi 实例并将服务代码更改为:
interface AccountService {
@GET("u/17350105/test.json")
@Wrapped("user")
fun signUpAnonymously() : Observable<User>
}
Run Code Online (Sandbox Code Playgroud)
不需要任何其他自定义适配器。
| 归档时间: |
|
| 查看次数: |
4826 次 |
| 最近记录: |