How to parse retrofit json response to object model with Moshi(如何用Moshi将改造后的JSON响应解析为对象模型)
问题描述
改装实例:
fun getMoshi() : Moshi{
return Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
}
fun retrofit(baseUrl: String): Retrofit = Retrofit.Builder()
.client(getClient())
.baseUrl(baseUrl)
.addConverterFactory(MoshiConverterFactory.create(getMoshi()).asLenient())
.build()
}
BaseValidation模型:
@JsonClass(generateAdapter = true)
data class BaseValidation (
val status : String,
val data : List<Data>
)
响应解析:
val type: Type = Types.newParameterizedType(String::class.java, Data::class.java)
val moshi = Moshi.Builder().build()
val jsonAdapter: JsonAdapter<Map<String,Data>> = moshi.adapter(type)
val baseValidation = jsonAdapter.fromJson(response.errorBody()!!.charStream().toString())!!
结果为:
Platform class java.lang.String in java.lang.String<com.example.vow.data_remote.model.create.response.validation.Data> requires explicit JsonAdapter to be registered
我是Moshi的新手,有点困惑如何正确解析,我已经使用下面的代码设法用gson实现了这个结果,但我想了解一下Moshi是如何做到的:
val gson = Gson()
val type = object : TypeToken<BaseValidation>() {}.type
var errorResponse: BaseValidation? = gson.fromJson(response.errorBody()!!.charStream(), type)
下面的类型是否定义正确?
val type: Type = Types.newParameterizedType(String::class.java, Data::class.java)
更新
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val jsonAdapter: JsonAdapter<BaseValidation> = moshi.adapter(BaseValidation::class.java).lenient()
val baseValidation = jsonAdapter.fromJson(response.errorBody()!!.charStream().toString())!!
退货
com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $
当Moshi由
设置为lenient()时moshi.adapter(BaseValidation::class.java).lenient()
我收到
Expected BEGIN_OBJECT but was STRING at path $
OkHttp响应为
{
"status": "validation",
"data": [
{
"type": "Email",
"code": 3000,
"field": "User.contact.email",
"message": "Email is invalid"
}
]
}
解决方案
也许它将来会对某人有所帮助
response.errorBody()!!.charStream().toString()
而应为
response.errorBody()?.source()
推荐答案
如果要将moshi与kotlin反射一起使用,请不要忘记添加KotlinJsonAdapterFactory
。我想这会很好用的:
val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
val jsonAdapter = moshi.adapter(BaseValidation::class.java)
val baseValidation = jsonAdapter.fromJson(response.errorBody()!!.charStream().toString())!!
此外,您还可以从类中删除@JsonClass
注释。使用反射时不需要。
这篇关于如何用Moshi将改造后的JSON响应解析为对象模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!