Gson deserializa json con diferentes tipos de valor
Estoy tratando de deserializar un JSONArray
con Gson, uno de los valores de tipo puede variar, el valor "in_wanted" puede ser un boolean
o un JSONObject
.
In_wanted como boolean
:
- Archivo o base de datos? - Mejores prácticas para guardar objetos en dispositivos Android
- Com.google.gson.JsonSyntaxException al intentar analizar Date / Time en json
- Android Volley varias solicitudes
- Analiza JSON en una salida amigable de ListView
- Cómo configurar el encabezado de solicitud para enviar datos desde aplicaciones de Android a nuestro servidor
{ "movies": [ { "title": "example boolean", "in_wanted": false } ] }
In_wanted como JSONObject
:
{ "movies": [ { "title": "example object", "in_wanted": { "profile": { "value": false } } } ] }
Necesito el objeto cuando está disponible y necesito un deserializador para devolver null siempre que el valor de "in_wanted" sea un booleano. ¿Cuál sería la mejor manera de hacer esto con Gson?
- ¿Utilizar JSONArray en otra clase?
- Android no procesar objeto JSON
- Cómo crear un objeto Json anidado en Java?
- Android - Extraño EscapeUtil.unescapeString falla
- Cómo cambiar el tipo de contenido de MappingJacksonHttpMessageConverter de application / json; charset = UTF-8 a application / json
- Cómo analizar el análisis de json Usando GSON en android
- Android: pasa un objeto JSON entre fragmentos
- Android analiza caracteres especiales en la respuesta de json
Puede hacer esto con el deserializador personalizado. Al principio debemos crear un modelo de datos que pueda representar su JSON.
class JsonEntity { private List<Movie> movies; public List<Movie> getMovies() { return movies; } public void setMovies(List<Movie> movies) { this.movies = movies; } @Override public String toString() { return "JsonEntity [movies=" + movies + "]"; } } class Movie { private String title; private Profile in_wanted; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Profile getIn_wanted() { return in_wanted; } public void setIn_wanted(Profile in_wanted) { this.in_wanted = in_wanted; } @Override public String toString() { return "Movie [title=" + title + ", in_wanted=" + in_wanted + "]"; } } class Profile { private boolean value; public boolean isValue() { return value; } public void setValue(boolean value) { this.value = value; } @Override public String toString() { return String.valueOf(value); } }
Ahora cuando tenemos todas las clases necesarias debemos implementar nuevo deserializador personalizado:
class ProfileJsonDeserializer implements JsonDeserializer<Profile> { @Override public Profile deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException { if (jsonElement.isJsonPrimitive()) { return null; } return context.deserialize(jsonElement, JsonProfile.class); } } class JsonProfile extends Profile { }
Por favor, eche un vistazo a la clase JsonProfile
. Tenemos que crearlo para evitar el "bucle de deserialización" (parte complicada).
Y ahora podemos probar nuestra solución con el método de prueba:
GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Profile.class, new ProfileJsonDeserializer()); Gson gson = builder.create(); JsonEntity jsonEntity = gson.fromJson(new FileReader("/tmp/json.txt"), JsonEntity.class); System.out.println(jsonEntity);
Usted podría hacer un análisis manual, algo así como:
JsonParser parser = new JsonParser(); JsonObject rootObject = parser.parse(yourJsonString).getAsJsonObject(); JsonObject movieObject = rootObject .getAsJsonArray("movies") .get(0).getAsJsonObject(); JsonElement inWantedElement = movieObject.get("in_wanted"); //Check if "in_wanted" element is a boolean or an object if (inWantedElement.isJsonObject()) { //Process the element as an object... //for example get the element "value"... boolean value = inWantedElement .getAsJsonObject() .getAsJsonObject("profile") .getAsJsonPrimitive("value") .getAsBoolean(); } else if (inWantedElement.isJsonPrimitive()) { //Process the element as a boolean... boolean inWanted = inWantedElement.getAsBoolean(); }
Nota: consulte la documentación de la API de Gson para obtener más información sobre los tipos JsonObject
, JsonArray
, JsonElement
, etc.
- ¿Cómo enviar medios desde el servidor a la aplicación Android?
- AlertDialog.Builder: No se muestran elementos para las casillas de verificación