Gson – Igual nombre de campo, diferentes tipos

Pregunté esto en una pregunta diferente hoy, pero me temo que no obtendrá ninguna solución debido a la forma en que fue expresada.

Tengo una entrada json que tiene los siguientes datos:

Json

Como puede ver, el elemento option_value es un Array en un objeto y una cadena simple en otro objeto.

¿Cómo puedo hacer que Gson maneje esto correctamente? Mi clase tiene esto descrito como un objeto List, por lo que funciona para los primeros elementos donde option_value es una matriz, pero cuando se convierte en una cadena , la aplicación se bloquea y obtengo una excepción jsex .

¿Hay una solución para esto?

ACTUALIZAR

Agregar la parte relevante de mi clase como se solicita:

public class Options { String product_option_id; String option_id; String name; String type; String required; List<OptionValue> option_value; // get set stuff here public class OptionValue { String product_option_value_id; String option_value_id; String name; String image; String price; String price_prefix; // get set stuff here } } 

Tengo una solución para usted 🙂 Para este propósito debemos usar deserializer personalizado. Remake su clase como esto:

 public class Options{ @SerializedName ("product_option_id"); String mProductOptionId; @SerializedName ("option_id"); String mOptionId; @SerializedName ("name"); String mName; @SerializedName ("type"); String mType; @SerializedName ("required"); String mRequired; //don't assign any serialized name, this field will be parsed manually List<OptionValue> mOptionValue; //setter public void setOptionValues(List<OptionValue> optionValues){ mOptionValue = optionValues; } // get set stuff here public class OptionValue { String product_option_value_id; String option_value_id; String name; String image; String price; String price_prefix; // get set stuff here } public static class OptionsDeserilizer implements JsonDeserializer<Options> { @Override public Offer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { Options options = new Gson().fromJson(json, Options.class); JsonObject jsonObject = json.getAsJsonObject(); if (jsonObject.has("option_value")) { JsonElement elem = jsonObject.get("option_value"); if (elem != null && !elem.isJsonNull()) { String valuesString = elem.getAsString(); if (!TextUtils.isEmpty(valuesString)){ List<OptionValue> values = new Gson().fromJson(valuesString, new TypeToken<ArrayList<OptionValue>>() {}.getType()); options.setOptionValues(values); } } } return options ; } } } 

Antes de permitir que json de parson de gson, debemos registrar nuestro deserializador personalizado:

 Gson gson = new GsonBuilder() .registerTypeAdapter(Options.class, new Options.OptionsDeserilizer()) .create(); 

Y ahora – solo llame:

 Options options = gson.fromJson(json, Options.class); 

En mi situación, el campo con el mismo nombre es "data": {} o "data": [ array_with_real_data ]. Así que el código de la respuesta aceptada necesita ser modificado ligeramente, como esto:

 @Override public MyClass deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { MyClass bean = new Gson().fromJson(json, MyClass.class); JsonObject jsonObject = json.getAsJsonObject(); if (jsonObject.has("data")) { JsonArray array = jsonObject.getAsJsonArray("data"); if (array != null && !array.isJsonNull()) { List<Data> data = new Gson().fromJson(array, new TypeToken<ArrayList<Data>>() {}.getType()); bean.realData = data; } } return bean ; } 

Espero que ayude.

  • Retrofit y Jackson y análisis de JSON
  • Mejor manera de determinar si existe un valor en el feed de JSON
  • Recuperación de datos de firebase
  • No se puede analizar la matriz Json con Gson
  • ¿Cómo iterar este JSON Array usando Java y org.json en Android?
  • ¿Cómo hacer que el agente api.ai aprenda algo dinámicamente?
  • Creación de un WebService ASP.net que devuelve JSON en lugar de XML
  • Android conexión a json / xml api
  • Error de puntero nulo en la tarea asíncrona
  • Img src atributo de json valor que muestra pequeña caja de color azul en Android TextView
  • Android JSon error "Esperaba BEGIN_OBJECT pero era BEGIN_ARRAY en la línea 1 columna 2"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.