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 :

 { "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?

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.

  • FlexJson ClassNotFound Exception en Android 4.4.4
  • Análisis de Android JSONObject
  • Los objetos Json de Android / Java cuentan
  • Deserializar un objeto JSON con múltiples elementos dentro de él
  • ¿Cómo mantener el inicio de sesión del servidor en toda la aplicación nativa de Android?
  • Cómo analizar JSON analizado para uso sin conexión
  • ¿Cómo puedo enviar JSon como BODY en una solicitud POST al servidor desde una aplicación de Android?
  • AsycnTask # 3 error al analizar el objeto JSON. String no se puede convertir a JSONObject
  • JSONObject to String Android
  • Envío de datos de Android a servidor con datos JSON
  • Cómo analizar datos de 2 URL diferentes mediante el método asyncTask
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.