class ModelToMultiPartBodyBuilder { fun provide(any: Any) = MultipartBody.Builder().apply { fromMap(any.toMap()) } private fun MultipartBody.Builder.fromMap(map: Map) { map .forEach { entry -> when (entry.value) { is List<*> -> { (entry.value as List<*>).forEachIndexed { index, any -> any?.toMap()?.let { fromMap( it.asIterable() .associate { newEntry -> "${entry.key}[$index].${newEntry.key}" to newEntry.value } ) } } } else -> addFormDataPart(entry.key, entry.value.toString()) } } } private fun Any.toMap(): Map = Gson().run { fromJson(toJson(this@toMap), object : TypeToken>() {}.type) } }