Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何用Moshi解析对对象模型的json响应_Android_Kotlin_Retrofit_Retrofit2_Moshi - Fatal编程技术网

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