Android 如何用Moshi解析对对象模型的json响应
改装实例:Android 如何用Moshi解析对对象模型的json响应,android,kotlin,retrofit,retrofit2,moshi,Android,Kotlin,Retrofit,Retrofit2,Moshi,改装实例: fun getMoshi() : Moshi{ return Moshi.Builder() .add(KotlinJsonAdapterFactory()) .build() } fun retrofit(baseUrl: String): Retrofit = Retrofit.Builder() .client(getClient()) .baseUrl(
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()
}
基本验证模型:
@JsonClass(generateAdapter = true)
data class BaseValidation (
val status : String,
val data : List<Data>
)
更新
当moshi通过设置为lenient()时
我明白了
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
注释。使用反射时不需要它。我实际上很好奇是否可以不创建一个数据类来检索状态和数据属性,而是立即访问数据数组属性。在我的例子中,状态总是success,因此创建一个包含状态和数据列表的数据类是没有意义的。思想?
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.adapter(BaseValidation::class.java).lenient()
Expected BEGIN_OBJECT but was STRING at path $
{
"status": "validation",
"data": [
{
"type": "Email",
"code": 3000,
"field": "User.contact.email",
"message": "Email is invalid"
}
]
}
response.errorBody()!!.charStream().toString()
response.errorBody()?.source()