Mejora del análisis de Java / Kotlin JSON
Consumo una API que me da este tipo de JSON:
{ "data": { "name": "Start", "pid": "1", "position": { "data": { "x": "31", "y": "330" }, "metadata": "empty" } }, "metadata": "empty" }
He creado las clases con objetos con la misma estructura que el JSON anterior. Yo uso el retrofit
lib en Android que utiliza dentro de GSON
para analizar el JSON.
- ¿Cómo analizar estos datos JSON utilizando GSON? Y ponerlo en un ArrayList
- Error al analizar datos org.json.JSONException: El valor <? Xml del tipo java.lang.String no se puede convertir a JSONArray
- Analizador de SAX de Android que no obtiene texto completo entre etiquetas
- Org.json.JSONObject no se puede convertir en JSONArray
- Reemplazar el analizador estándar de Android JSON para un mejor rendimiento?
Mis clases de modelo sería así:
MResponse.class
public class MResponse { @SerializedName("data") public User user; String metadata; }
Clase de usuario
public class User { public String name; public String pid; @SerializedName("position") public PositionData positionData; }
PositionData.class
public class PositionData { @SerializedName("data") public Position position; public String metadata; }
Clase de posición
public class Position { public String x; public String y; }
Ahora esto funciona bien para mí. Pero como se puede ver para cada modelo que tengo que crear un padre que tendrá la misma estructura sólo cambia el niño. Este hecho duplica las clases que utilizo para mis modelos. Me gustaría preguntar si hay una mejor manera de evitar todas estas clases.
No quiero usar clases internas. Yo estaba pensando que los chicos que han hecho el JSON como este debe haber tenido una razón por la que lo hicieron así y también una manera de hacer el análisis más fácil.
Por lo general, se utiliza para analizar este tipo de estructura JSON:
{ "data": { "name": "Start", "pid": "1", "position": { "x": "31", "y": "330" } } }
Y aquí es más fácil si quisiera seguir la solución anterior.
EDITAR
También se acoge con satisfacción cualquier solución en Kotlin
EDIT 2
Solución para Kotlin aquí
- Error de análisis de Android JSON no se puede convertir a JSONArray
- Json Parsing de Url en Android, no funciona
- Cómo obtener respuesta como String utilizando retrofit sin utilizar GSON o cualquier otra biblioteca en android
- Envío y análisis de objetos JSON
- Parsing Gson con Json no funciona para Android
- ¿Qué analizador DOM de HTML funciona mejor en Android?
- Cómo analizar JSON en Android
- Desvío de paquetes VPN
No creo que su solicitud sea posible. Si hay una solución, entonces sólo crearía clases intermedias que harían prácticamente lo mismo que lo que estás haciendo.
En Kotlin, haría lo anterior así. Siéntase libre de ponerlo en un archivo .kt
:
data class MResponse(@SerializedName("data") val user: User, val metadata: String) data class User(val name: String, val pid: String, @SerializedName("position") val positionData: PositionData) data class PositionData(@SerializedName("position") val position: Position, val metadata: String) data class Position(val x: String, val y: String)
Bueno, la solución que yo estaba pidiendo era bastante simple en mi opinión, simplemente no lo sabía en el principio.
Basado en el código fuente de Retrofit
y algunas otras respuestas relacionadas con los Java generics
esta fue la respuesta a mi problema:
public class DataResponse<T, R> { public T data; @SerializedName("meta") public R metadata; }
Y este es un ejemplo de cómo puedo usarlo:
Observable<DataResponse<User, BaseMeta>> getUser()
Para mí esta fue la solución. Si hay mejor solución por ahí, estoy listo para aceptarlos.
- Android, NSD / DNS-SD: detección no confiable de NsdManager y resolución de IP
- Cómo depurar el detector de pelusa personalizado