【问题标题】:How to serialize SparseArray with Moshi如何用 Moshi 序列化 SparseArray
【发布时间】:2018-03-27 15:36:46
【问题描述】:

如何通过 Moshi 将 SparseArray 序列化为 JSON? 我真的不明白如何为此制作正确的适配器,不胜感激。

编辑: 我已经通过这段代码让它工作了

class SparseArrayJsonAdapter : JsonAdapter<SparseArray<WaterWarningItem>>() {
override fun fromJson(reader: JsonReader?): SparseArray<WaterWarningItem> {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun toJson(writer: JsonWriter?, value: SparseArray<WaterWarningItem>) {
    writer?.let { writer ->
        writer.beginArray()
        for (i in 0 until value.size()) {
            val key = value.keyAt(i)
            val item = value[key]
            writeWarningItem(writer, item)
        }
        writer.endArray()
        writer.close()
    }
}

fun writeWarningItem(writer: JsonWriter, item: WaterWarningItem) {
    writer.beginObject()
    writer.name("id").value(item.id)
    writer.name("title").value(item.title)
    writer.name("warning_lvl").value(item.warningLvl)
    writer.name("own_limit").value(item.ownLimit)
    writer.endObject()
}

}

我像这样使用这个适配器

val a = SparseArrayJsonAdapter()
val json = a.toJson(value)

但我不知道这是否正确。在所有示例中,适配器都由 moshi builder 附加,但它不适用于我的适配器。 这样可以吗?

【问题讨论】:

标签: android moshi


【解决方案1】:

基于您现有的 toJson 实现,这是一个可用于序列化 SparseArrays 的通用版本。

class SparseArrayJsonAdapter(
    private val elementAdapter: JsonAdapter<Any?>) : JsonAdapter<SparseArray<Any?>>() {
  object Factory : JsonAdapter.Factory {
    override fun create(type: Type, annotations: Set<Annotation>,
        moshi: Moshi): JsonAdapter<*>? {
      if (annotations.isNotEmpty()) return null
      val rawType = Types.getRawType(type)
      if (rawType != SparseArray::class.java) return null
      val elementType = (type as ParameterizedType).actualTypeArguments[0]
      return SparseArrayJsonAdapter(moshi.adapter(elementType))
    }
  }

  override fun fromJson(reader: JsonReader): SparseArray<Any?> {
    throw UnsupportedOperationException()
  }

  override fun toJson(writer: JsonWriter, value: SparseArray<Any?>?) {
    checkNotNull(value, { "Adapter doesn't support null. Wrap with nullSafe()." }).apply {
      writer.beginArray()
      var index = 0
      val size = size()
      while (index < size) {
        elementAdapter.toJson(writer, valueAt(index++))
      }
      writer.endArray()
    }
  }
}

data class WaterWarningItem(val id: Long, val title: String, val warning_lvl: String,
    val own_limit: String)

fun main(args: Array<String>) {
  val moshi = Moshi.Builder().add(SparseArrayJsonAdapter.Factory).build()
  val adapter = moshi.adapter<SparseArray<WaterWarningItem>>(
      Types.newParameterizedType(SparseArray::class.java, WaterWarningItem::class.java))
  val result = adapter.toJson(SparseArray<WaterWarningItem>(1).apply {
    put(7, WaterWarningItem(5L, "Hello", "Fine", "Okay"))
  })
}

【讨论】:

  • 谢谢,这正是我想要的。
猜你喜欢
  • 2013-06-18
  • 2018-08-09
  • 2019-09-19
  • 2017-04-18
  • 2016-09-16
  • 1970-01-01
  • 2017-10-06
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多