Created
April 12, 2021 13:34
-
-
Save 1gravity/24dc6284e572b9fd7682597dae4c5842 to your computer and use it in GitHub Desktop.
Json ArrayList adapter for Moshi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
abstract class MoshiArrayListJsonAdapter<C : MutableCollection<T>?, T> private constructor( | |
private val elementAdapter: JsonAdapter<T> | |
) : | |
JsonAdapter<C>() { | |
abstract fun newCollection(): C | |
override fun fromJson(reader: JsonReader): C { | |
val result = newCollection() | |
reader.beginArray() | |
while (reader.hasNext()) { | |
result?.add(elementAdapter.fromJson(reader)!!) | |
} | |
reader.endArray() | |
return result | |
} | |
override fun toJson(writer: JsonWriter, value: C?) { | |
writer.beginArray() | |
for (element in value!!) { | |
elementAdapter.toJson(writer, element) | |
} | |
writer.endArray() | |
} | |
override fun toString() = "$elementAdapter.collection()" | |
companion object { | |
val FACTORY = Factory { type, annotations, moshi -> | |
val rawType = Types.getRawType(type) | |
if (annotations.isNotEmpty()) return@Factory null | |
if (rawType == ArrayList::class.java) { | |
return@Factory newArrayListAdapter<Any>( | |
type, | |
moshi | |
).nullSafe() | |
} | |
null | |
} | |
private fun <T> newArrayListAdapter( | |
type: Type, | |
moshi: Moshi | |
): JsonAdapter<MutableCollection<T>> { | |
val elementType = | |
Types.collectionElementType( | |
type, | |
MutableCollection::class.java | |
) | |
val elementAdapter: JsonAdapter<T> = moshi.adapter(elementType) | |
return object : | |
MoshiArrayListJsonAdapter<MutableCollection<T>, T>(elementAdapter) { | |
override fun newCollection(): MutableCollection<T> { | |
return ArrayList() | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment