簡體   English   中英

如何使用 Moshi 解析 retrofit json 對 object model 的響應

[英]How to parse retrofit json response to object model with Moshi

Retrofit 實例:

    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()

}

基本驗證 model:

    @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注釋。 使用反射時不需要它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM