android - Moshi 适配器跳过 List<T> 中的坏对象

标签 android json kotlin adapter moshi

我使用 Moshi,但我需要用有缺陷的后端来解决我的问题。有时,当我请求对象列表时,其中一些不包含必填字段。当然,我可以捕获并处理JsonDataException,但我想跳过这些对象。我怎样才能用 Moshi 做到这一点?

更新

我有几个模型可以完成我的任务

@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 适配器跳过它。

最佳答案

解决方案中有一个陷阱,它只在失败后捕获并忽略。如果您的元素适配器在发生错误后停止读取,例如,读取器可能正在读取嵌套对象,然后下一个 hasNext 调用将在错误的位置调用。

正如 Jesse 提到的,您可以查看并跳过整个值。

class SkipBadElementsListAdapter(private val elementAdapter: JsonAdapter<Any?>) :
    JsonAdapter<List<Any?>>() {
  object Factory : JsonAdapter.Factory {
    override fun create(type: Type, annotations: Set<Annotation>, moshi: Moshi): JsonAdapter<*>? {
      if (annotations.isNotEmpty() || Types.getRawType(type) != List::class.java) {
        return null
      }
      val elementType = Types.collectionElementType(type, List::class.java)
      val elementAdapter = moshi.adapter<Any?>(elementType)
      return SkipBadElementsListAdapter(elementAdapter)
    }
  }

  override fun fromJson(reader: JsonReader): List<Any?>? {
    val result = mutableListOf<Any?>()
    reader.beginArray()
    while (reader.hasNext()) {
      try {
        val peeked = reader.peekJson()
        result += elementAdapter.fromJson(peeked)
      } catch (ignored: JsonDataException) {
      }
      reader.skipValue()
    }
    reader.endArray()
    return result

  }

  override fun toJson(writer: JsonWriter, value: List<Any?>?) {
    if (value == null) {
      throw NullPointerException("value was null! Wrap in .nullSafe() to write nullable values.")
    }
    writer.beginArray()
    for (i in value.indices) {
      elementAdapter.toJson(writer, value[i])
    }
    writer.endArray()
  }
}

关于android - Moshi 适配器跳过 List<T> 中的坏对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145519/

相关文章:

C# 错误的 PKCS7 填充

android - 在 flutter 中仅显示产品名称列表,使用 json 格式的 woocommerce api 数据

javascript - 如何在 getJSON 调用上处理 "Uncaught TypeError: Cannot set property ' prop' of undefined"?

r - 读取 json 文件时将嵌套列表转换为数据帧

java - 为什么我的 View 数组返回 null?

android - Android 应用程序的设计问题,适用于三星 Note 2 和 Galaxy S4 等少数手机设备

java - 如何在 Eclipse 中使用 Lombok 生成复杂 json 的 pojo

android - 通知 onSwiped 方法列表在 mainActivity 中排序

android - FragmentManager提交后执行功能

intellij-idea - 子项目中对包的未解决依赖关系