web-dev-qa-db-fra.com

google gson classe LinkedTreeMap transféré dans myclass

Je savais que cette question avait déjà été posée. En raison de mes compétences de novice en Java et Android. Je ne peux pas résoudre ce problème pendant plus d'une semaine. 

Un de mes amis et moi développons un projet Android où il y a quelques choses comme ça. 

La partie la plus étrange de ces choses est, cela ne se produit que lorsque je télécharge et teste à partir de Google Play Store. Pas de l'installation locale du studio Android ou du mode débogage. 

Quel pourrait être le problème ici, ou cette liste de renvoi qui est totalement fausse? 

S'il vous plaît, suggérez-moi où devrais-je continuer à creuser?

@Override
public void promiseMethod(JSONObject object) {
    if (object != null) {

        if (object.has(DO_SERVICES)) {
            vehicleDetails = new ArrayList < Object[] > (1);
            List < String > vehicleNoList = new ArrayList < String > (1);
            List < String > serviceList = new ArrayList < String > (1);
            try {
                Gson gson = new Gson();
                JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES)
                    .toString());
                servDto = gson.fromJson(jsonObj.toString(),
                    ServiceDto.class);


                if (servDto.getServiceDto() instanceof List) {

                    List < DoServiceDto > doServiceList = servDto.getServiceDto();

L'exception est 

L'exception Java.lang.ClassCast: com.google.gson.internal.LinkedTreeMap ne peut pas être convertie en com.gaurage.dto.DoServiceDto at com.gaurage.user.User_Test_Main.promiseMethod (Source inconnue)

18
Tot

Sérialisation et désérialisation des types génériques

Lorsque vous appelez toJson (obj), Gson appelle obj.getClass () pour obtenir des informations sur les champs à sérialiser. De même, vous pouvez généralement passer l'objet MyClass.class dans la méthode fromJson (json, MyClass.class). Cela fonctionne correctement si l'objet est un type non générique. Toutefois, si l'objet est d'un type générique, les informations de type générique sont perdues à cause de l'effacement de type Java. Voici un exemple illustrant ce point: 

class Foo<T> {  T value;}
Gson gson = new Gson();
Foo<Bar> foo = new Foo<Bar>();
gson.toJson(foo); // May not serialize foo.value correctly
gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar

Le code ci-dessus ne parvient pas à interpréter la valeur en tant que type Bar, car Gson appelle list.getClass () pour obtenir ses informations de classe, mais cette méthode renvoie une classe brute, Foo.class. Cela signifie que Gson n'a aucun moyen de savoir qu'il s'agit d'un objet de type Foo, et pas simplement Foo. 

Vous pouvez résoudre ce problème en spécifiant le type paramétré correct pour votre type générique. Vous pouvez le faire en utilisant la classe TypeToken. 

Type fooType = new TypeToken<Foo<Bar>>() {}.getType();    
gson.toJson(foo, fooType);
gson.fromJson(json, fooType);

J'ai la classe Parent et sa classe enfant. Certaines d'entre elles contiennent des types List. Comme cette classe parente, j'ai 30 fichiers. Je l'ai résolu comme ça. 

Gson gson = new Gson();
JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES).toString());
Type type = new TypeToken<MyDto>() {}.getType();
servDto = gson.fromJson(jsonObj.toString(),type);

Le plus important, c'est que je ne peux pas reproduire cette erreur lors de tests locaux effectués par Android Studio. Ce problème n'apparaît que lorsque je génère un apk signé et que je publie une application sur PlayStore lorsque l'application s'arrête, et que le rapport ne peut pas renvoyer LinkedTreeMap à myclass.

Il était difficile pour moi de reproduire le même résultat lors de mes tests locaux (mode Debug inclus).

63
Tot

La source 

Dans Mon ListView BaseAdapter confronté au même problème

Format JSON à afficher 

{
    results: [
    {
        id: "10",
        phone: "+91783XXXX345",
        name: "Mr Example",
        email: "[email protected]"
    },
    {
        id: "11",
        phone: "+9178XXXX66",
        name: "Mr Foo",
        email: "[email protected]"
    }],
    statusCode: "1",
    count: "2"
}

Je faisais face à ce problème 

E/AndroidRuntime: EXCEPTION FATALE: main Processus: com.hsa.ffgp.hapdfgdfgoon, PID: 25879 Java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap ne peut pas être converti en com.hsa .......

Puis j'ai mappé les données en utilisant LinkedTreeMap Key Value comme ci-dessous

...
...

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        if(view==null)
        {
            view= LayoutInflater.from(c).inflate(R.layout.listview_manage_clients,viewGroup,false);
        }

        TextView mUserName = (TextView) view.findViewById(R.id.userName);
        TextView mUserPhone = (TextView) view.findViewById(R.id.userPhone);


        Object getrow = this.users.get(i);
        LinkedTreeMap<Object,Object> t = (LinkedTreeMap) getrow;
        String name = t.get("name").toString();

        mUserName.setText("Name is "+name);
        mUserPhone.setText("Phone is "+phone);

        return view;
    }
...
...
0
Code Spy

Dans mon cas, une erreur s'est produite lors de l'extraction d'une liste d'objets à partir de préférences partagées . L'erreur a été résolue en ajoutant TypeToken comme indiqué ci-dessous:

 public static <GenericClass> GenericClass getListOfObjectsFromSharedPref(Context context,String preferenceFileName, String preferenceKey ){

    SharedPreferences sharedPreferences = 
    context.getSharedPreferences(preferenceFileName, 0);
    Type type = new TypeToken<ArrayList<Classname.class>>() {}.getType();
    String json = sharedPreferences.getString(preferenceKey, "");
    final Gson gson = new Gson();
    return gson.fromJson(json, type);
}

....

0
Deepak Kataria