Moshi适配器可跳过List< T>中的不良对象。 [英] Moshi adapter to skip bad objects in the List<T>
本文介绍了Moshi适配器可跳过List< T>中的不良对象。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用Moshi,我需要使用越野车解决我的问题。有时,当我请求对象列表时,其中一些不包含必填字段。当然,我可以捕获并处理 JsonDataException
,但是我想跳过这些对象。我该如何使用Moshi?
I use Moshi and I need to solve my problem with a buggy backend. Sometimes, when I request a list of objects, some of them don't contain mandatory fields. Of course, I can catch and process JsonDataException
, but I want to skip these objects. How can I do it with Moshi?
更新
我有几个我的任务的模型
I have a couple of models for my task
@JsonClass(generateAdapter = true)
data class User(
val name: String,
val age: Int?
)
@JsonClass(generateAdapter = true)
data class UserList(val list: List<User>)
和错误的JSON
{
"list": [
{
"name": "John",
"age": 20
},
{
"age": 18
},
{
"name": "Jane",
"age": 21
}
]
}
如您所见,第二个对象没有强制性的 name
字段,我想通过Moshi适配器跳过它。
as you can see, the second object has no mandatory name
field and I want to skip it via Moshi adapter.
推荐答案
找到答案了
class SkipBadListObjectsAdapterFactory : JsonAdapter.Factory {
override fun create(type: Type, annotations: MutableSet<out Annotation>, moshi: Moshi): JsonAdapter<*>? {
return if (annotations.isEmpty() && Types.getRawType(type) == List::class.java) {
val elementType = Types.collectionElementType(type, List::class.java)
val elementAdapter = moshi.adapter<Any>(elementType)
SkipBadListObjectsAdapter(elementAdapter)
} else {
null
}
}
private class SkipBadListObjectsAdapter<T : Any>(private val elementAdapter: JsonAdapter<T>) :
JsonAdapter<List<T>>() {
override fun fromJson(reader: JsonReader): List<T>? {
val goodObjectsList = mutableListOf<T>()
reader.beginArray()
while (reader.hasNext()) {
try {
elementAdapter.fromJson(reader)?.let(goodObjectsList::add)
} catch (e: JsonDataException) {
// Skip bad element ;)
}
}
reader.endArray()
return goodObjectsList
}
override fun toJson(writer: JsonWriter, value: List<T>?) {
throw UnsupportedOperationException("SkipBadListObjectsAdapter is only used to deserialize objects")
}
}
}
谢谢其他主题的人 =)
Thank you "guys from the other topics" =)
这篇关于Moshi适配器可跳过List< T>中的不良对象。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文