Как сериализовать SparseArray с помощью Moshi

Как я могу сериализовать SparseArray в JSON с помощью Moshi? Я действительно не понимаю, как сделать для этого правильный адаптер, любая помощь приветствуется.

Обновлено: Я заставил это работать с помощью этого кода

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 во всех примерах, но он не работает с моим адаптером. Это нормально?

Что ты пробовал? Вы можете начать с создания более простой версии встроенного адаптера карты: github.com/square/moshi/blob/master/moshi/src/main/java/com/‌…

Eric Cochran 27.03.2018 19:11

Можете ли вы опубликовать, как выглядит ваш JSON?

Eric Cochran 28.03.2018 03:24

Я отредактировал свой вопрос, чтобы добавить, как я заставил его работать.

Sparrow318 28.03.2018 08:41
1
3
441
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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"))
  })
}

Спасибо, это именно то, что я искал.

Sparrow318 05.04.2018 13:09

Другие вопросы по теме