Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

306
Views
Retrofit2, cómo puedo convertir la respuesta con diferentes nombres de objetos pero con los mismos tipos de datos

Tengo una llamada que devuelve el nombre de diferentes objetos, en este caso, cada nombre es el hash de la dirección de su billetera, pero me gustaría tratarlos de manera indiferente porque lo único que importa son los datos que están dentro de ellos, usando un convertidor estándar como Gson No puedo hacer esto, ¿hay alguna forma de hacerlo manualmente?

 { "0x1234": { "success": true, "cache_last_updated": 1642815869695, "total": 500 }, "0x1244445": { "success": true, "cache_last_updated": 1642815869695, "total": 324 }, "0x47851":{ "success": true, "cache_last_updated": 1642815869695, "total": 324 } }

Mi repositorio:

 class WalletsResumeRepository( private val service: apiService ) { suspend fun getAddressData(listAddress: List<String>): Flow<Result<List<DetailModel>>> = flow { emit(Result.success(service.getWalletResume(listAddress)) }.catch { e -> emit(Result.failure(RuntimeException("Something went wrong ${e.cause}"))) } }

mi repositorio siempre cae en el escenario de captura con un NPE, recordando que la respuesta puede tener innumerables direcciones, por lo que infinitos nombres de objetos, ¿cómo puedo tratarlos como genéricos y mapear solo las respuestas como listas? ¿o algo así?

servicio.kt

 suspend fun getWalletResume(@Path("address") wallet: String): WalletDetailDTO

MonederoDTO

 data class WalletDetailDTO( val success: Boolean, @SerializedName("cache_last_updated") val cacheLastUpdated: Long?, val totalSlp: Int? )
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Según entiendo su pregunta, esto tiene menos que ver con la actualización y más con el análisis JSON. Debido a que la estructura de la carga útil es un poco incómoda, le sugiero que la consuma en dos pasos:

  • paso 1. Consumir el success del content , cache_last_updated y total
  • paso 2. Agrega la id
 data class DetailModel(val id: String = "", val success: Boolean, val cache_last_updated: Long, val total: Int) interface apiService { @GET("....") fun getWalletResume( listAddress: List<String> ): Call<Map<String, DetailModel>> }

El resultado de llamar a apiService.getWalletResume es Map<String, DetailModel> que luego procesa en el paso 2.

Ejemplo

 val json = """ { "0x1234": { "success": true, "cache_last_updated": 1642815869695, "total": 500 }, "0x1244445": { "success": true, "cache_last_updated": 1642815869695, "total": 324 }, "0x47851": { "success": true, "cache_last_updated": 1642815869695, "total": 324 } } """.trimIndent() data class DetailModel(val id: String = "", val success: Boolean, val cache_last_updated: Long, val total: Int) fun main() { val gson = Gson() val type: Type = object : TypeToken<Map<String, DetailModel>?>() {}.type // step 1. simulates the retrofit call val mapResult: Map<String, DetailModel> = gson.fromJson(json, type) // step 2 val result = mapResult.map { entry -> entry.value.copy(id = entry.key) } println(result) // [DetailModel(id=0x1234, success=true, cache_last_updated=1642815869695, total=500), DetailModel(id=0x1244445, success=true, cache_last_updated=1642815869695, total=324), DetailModel(id=0x47851, success=true, cache_last_updated=1642815869695, total=324)] }
over 4 years ago · Santiago Trujillo Report

0

Me parece que solo está buscando un tipo de respuesta de Map<String, WalletDetailDTO> . Luego, simplemente puede mirar los "valores" en el mapa para obtener una lista única de objetos.

Entonces su llamada de servicio parece

 @GET("....") suspend fun getWalletDetails(...): Map<String, WalletDetailDTO>

Luego, cuando consuma esos datos, sacaría los valores:

 val mapOfWalletDetails = apiService.getWalletResume(...) val walletDetailCollection: Collection<WalletDetailDTO> = mapOfWalletDetails.values()

Esta walletDetailCollection final parece ser lo que está buscando si solo desea ignorar las claves en el mapa original.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!