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.

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í

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.

  • GSON evitar el JsonSyntaxException devolver el mapeo parcial
  • Cómo analizar este JSON Array en android
  • GSON. Cómo convertir json objeto a json array?
  • Analizar: enviar notificaciones push desde la aplicación
  • Análisis de JSON en Android
  • Android NumberFormatException: Doble no válido - excepto que el valor es un doble válido
  • Cómo solucionar IncompatibleClassChangeError durante Android Jackson Parsing usando anotaciones en Android Lollipop?
  • Análisis de la cadena JSON en android
  • Errores de json-parsing en tiempo de ejecución
  • Parse json cadena de fecha en android
  • Base de datos de Android más rápida
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.