Análisis de un ID de cadena con SugarORM y GSON
Estoy usando GSON
para crear un objeto de SugarRecord
de una respuesta de json. La API que estoy usando devuelve un campo llamado "id", pero el tipo de "id" es una cadena, no mucho (el backend está usando mongo).
A continuación se muestra el código que estoy usando:
- Android studio no puede resolver import org.json.JSONObject
- Android: Convertir secuencia a cadena sin quedarse sin memoria
- Android conexión a json / xml api
- Android usando MSGPack Core y Jackson Mapper - clase de decodificación variable de tipo desconocido
- Werid ClassCastException en TreeMap.containsKey ()
Gson gson = new Gson(); // Or use new GsonBuilder().create(); NutritionPlan target = gson.fromJson(jsonObject.getJSONObject("nutrition_day").toString(), NutritionPlan.class);
A continuación se muestra mi respuesta json:
{ "nutrition_day": { "id": "5342b4163865660012ab0000", "start_on": "2014-04-08", "protein_target": 157, "sodium_limit": 2000 }
¿Hay una buena manera de manejar este escenario? Lo intenté
@Ignore long id;
y
@SerializedName("id") String nutrition_plan_id;
En mi modelo, pero tampoco ayudó. ¿Alguien familiarizado con Sugar ORM , y sabe cómo tratar con un campo de id
que no es un largo?
- Android Volley varias solicitudes
- Convertir de JSONArray a String y volver de nuevo
- Android analiza la serie Json de cadenas
- Permiso de la API de Youtube 403 Error prohibido
- ¿Cuál es el propósito básico de la anotación @SerializedName en android usando GSon
- No se puede analizar JSonArray en Android
- Cómo convertir HashMap a json Array en android?
- Cómo enviar datos JSON ARRAY al servidor en Android
Reemplace la clave "id" de la cadena por "nutrition_day_id". Puede utilizar el id json y el id sql.
jsonObject.getJSONObject("nutrition_day").toString().replace("\"id\"","\"nutrition_day_id\"")
Me ayudó a cambiar el nombre del id
a la mid
y añadir la anotación @Expose
a todos los campos que tienen que ser serializado y añadir la anotación @SerializedName
a nuevo campo de id
.
@SerializedName("id") @Expose private final String mid; @Expose private final String street;
He estado preocupado por el mismo problema, y la única solución que he encontrado fue renombrar el nombre del ID de mi API. Desde el ejemplo intente enviar nutrition_plan_id en lugar de id desde su API y lo haría el trabajo.
Aquí está mi solución, pero no será la mejor.
Acabo de ignorar id
en mi Feed
public class Feed extends SugarRecord<Feed> { @Expose int idMember; }
Funciona muy bien, sin embargo la id
real no es más utilizado.
Yo estaba buscando una solución a este problema desde hace bastante tiempo. Finalmente encontré una solución. Simplemente agregue la anotación @Table
a la clase deseada en lugar de extenderla desde SugarRecord
y agregar manualmente el atributo id
. Puede excluirlo de la serialización Gson a través de palabras clave transient
, o / y renombrarla, con la anotación @SerializedName
.
Ejemplo (funciona bien para mí en SugarOrm v1.4):
@Table public class MySugarOrmClass{ @SerializedName("db_id") private transient Long id = null; @SerializedName("id") private Integer aid; // Add an empty constructor public MySugarClass(){} //Other fields and class attributes ... }
Pero esto significa que no puede usar .save(), .delete()
, etc. en esta clase. En su lugar, debe utilizar los métodos estáticos de SugarRecord.save(), SugarRecord.delete()
: SugarRecord.save(), SugarRecord.delete()
, …
- Modificación del comportamiento de la línea
- Android (ART) bloqueo con error JNI DETECTED ERROR EN APLICACIÓN: jarray es una tabla de referencia indirecta de pila no válida o una referencia no válida