如何用Moshi将改造后的JSON响应解析为对象模型 [英] How to parse retrofit json response to object model with Moshi

查看:51
本文介绍了如何用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响应解析为对象模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆