Tipok
Tipok

Reputation: 695

Kotlin transformation of objects to another objects

http://cm08323.tmweb.ru/android/determinace/json/images.json I have some json to the server.

My database class:

@Entity
data class Image(val url: String = "", val urlAnswer: String = "", val race: String = "") : DisplayableItem, Persistable

Interface for api:

interface ImagesAdi {
    @GET("android/determinace/json/images.json")
    fun getImages(): Single<List<ImagesResponse>>
}
...
class ImagesResponse(
        val images: List<ImageSingle>)

class ImageSingle(val url: String,
            val url_answer: String,
            val race: String)

My mapper for transformation ImagesResponse to Image:

@Singleton
class ChooseRaceMapper @Inject constructor() : (ImageSingle) -> Image {
    override fun invoke(response: ImageSingle): Image = Image(response.url, response.url_answer, response.race)
}

How should look like transformer from List< ImageSingle > to List< Image >?

I have trasformer for single objects, he looks like that:

fun chooseRace(): Single<Image> = imagesAdi.getSingleImage()
        .map { chooseRaceMapper.invoke(it) }
        .doOnSuccess {
            database.addDetectedResult(it)
                    .subscribeIgnoreResult()

            requestImages()
        }

Can you help me to write transformer for type "List"? I trying make it, but it did not work out. Thanks. Sorry for my English.

Or transformation from List to List should be better in class Mapper? (In method invoke)

Upvotes: 5

Views: 6378

Answers (2)

johnny_crq
johnny_crq

Reputation: 4391

The interface declaration is wrong:

interface ImagesAdi {
    @GET("android/determinace/json/images.json")
    fun getImages(): Single<List<ImagesResponse>>
}

It should be (according to your json):

interface ImagesAdi {
    @GET("android/determinace/json/images.json")
    fun getImages(): Single<ImagesResponse>
}

And for the mapping part, something like this will do:

imagesAdi.getImages().map { it.images }
    .map { /* your mapper here */ }
    ...

Upvotes: 1

tynn
tynn

Reputation: 39873

Considering your images.json, your getImages() should not return a Single of a List.

@GET("android/determinace/json/images.json")
fun getImages(): Single<ImagesResponse>

Then you could use the Kotlin List.map() mapper to map the list.

imagesAdi.getImages()
    .map { list -> list.map { chooseRaceMapper.invoke(it) } }
    .doOnSuccess { }

Upvotes: 2

Related Questions