
{ "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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)