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:
- Android Visualización de datos de json a cardview en RecyclerView
- Cómo actualizar el PNR Capcha añadido en el Indian Railways Site
- GSON / Jackson en Android
- Respuesta de JSON de Django en Android
- Acceder a la respuesta JSON desde la vista web de android
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 } }
- El envío de JSON como datos adicionales en una transmisión de Android a través de ADB se formatea incorrectamente
- Envío de datos de Android a servidor con datos JSON
- Cómo eliminar el carácter oculto basura después de php json codificar
- Análisis de la cadena JSON en android
- Parse Json en el estudio android de String
- Deserialización de la matriz del asignador de objetos de json de jackson del androide
- Org.json.JSONException: Objeto no terminado en el carácter 14
- Convertir Facebook JSON created_time de formato String a formato largo
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.
- Diferentes fling (swipe) de velocidad en diferentes dispositivos Android con la misma densidad
- Acceso a los recursos de prueba de instrumentación