0
votes

Comment corriger NumberFormatexception lors de l'utilisation de gson.fromjson

J'ai une arraylist enregistré dans des préférences partagées, des objets personnalisés (livre) et maintenant que j'ai mis à jour l'application (a ajouté une nouvelle propriété appelée progrès, qui est un int), il semble que Gson tente de mettre un Parmi les longs dans cette variable int.

Cela ne se produit que pour sélectionner les utilisateurs, qui télécharge l'application dans le magasin et je n'ai pas pu le reproduire. J'ai posté quelque chose de similaire mais sans assez d'informations ici hier et j'ai réalisé que j'ai posté trop tôt. P>

Remarque: à myrr.auto1.myreadingrecord1.sharedfonctions.loadarraylist (SharedFunctions.java:40) est le Booklist = gson.fromjson (JSON, type); ligne p> xxx pré>

Voici comment on ressemble à la chaîne JSON, dans les anciennes versions: p> xxx pré>

et ceci est la classe de livre Les propriétés, les setters et les getters sont assez normaux, donc je ne les incluions pas. p> xxx pré>

donc pour certains, sélectionnez Utilisateurs que THE DJSON tente de mettre la valeur de démarrage ou de fin de temps dans le nouveau progrès. biens. Comment puis-je empêcher cela? P>

Il ne devrait que créer une nouvelle arrayliste de livre mais cela se bloque en fait. P>

Ajout: p>

public void setEndTime(long endTime) {
    this.endTime = endTime;
}

public void setStartTime(long startTime) {
    this.startTime = startTime;}

theCRBook.setStartTime(Calendar.getInstance().getTimeInMillis());


3 commentaires

Votre code fonctionne bien pour moi. Seule la modification que je devais faire était d'ajouter les crochets depuis que vous analysez ce JSON dans une liste


Oui, ça marche pour moi aussi, mais certains utilisateurs se bloquent et le seul moyen est de supprimer complètement les données d'application (les préférences partagées sont donc supprimées). J'ai même essayé d'ajouter des livres sur des succursales plus anciennes et de mettre à jour le nouveau et cela fonctionne pour moi.


@ lasagnakid77 Voir ma réponse mise à jour, je pense que cela aidera. Stackoverflow.com/a/54038589/1475574


3 Réponses :


1
votes

L'exception indique 1538513480946 est trop volumineux pour s'adapter à int , ce qui est correct. C'est un horodatage pour 10/02/2018 à 20h51 (UTC) et doit être stocké comme long .

Peut-être que vous avez une version plus ancienne de book classe où starttime ou endtime est déclaré comme int et non long (ou peut-être que le paramètre Setter est int ).


1 commentaires

J'ai vérifié et les deux statistiques et la fin de la fin ont été longs dès le début. J'ajoute un autre code lié à ces deux champs.



2
votes

Comme l'affiche l'erreur, vous avez activé le minatinyEnabled code> dans le build.gradle code> afin d'empêcher le code. Dans ce cas, vous devez faire le @serializedname ("Mintérieur") code>, @SerializedName ("Starttime") code> ... etc. Pour chaque variable que vous avez dans le modèle Parce que le nom de cette variable sera modifié sur les versions de libération.

public class Book implements Serializable {

    @SerializedName("author")
    private String author;

    @SerializedName("title")
    private String title;

    @SerializedName("pages")
    private String pages;

    @SerializedName("imageURL")
    private String imageURL;

    @SerializedName("description")
    private String description;

    @SerializedName("categories")
    private String categories;

    @SerializedName("moreInfoLink")
    private String moreInfoLink;

    @SerializedName("language")
    private String language;

    @SerializedName("progress")
    private int progress = 0;

    @SerializedName("startTime")
    private long startTime = 0L;

    @SerializedName("endTime")
    private long endTime = 0L;

    public Book (String author, String title, String pages, String description, String imageURL, String categories, String moreInfoLink, String language) {
        this.author = author;
        this.title = title;
        this.pages = pages;
        this.description = description;
        this.imageURL = imageURL;
        this.categories = categories;
        this.moreInfoLink = moreInfoLink;
        this.language = language;
    }
}


5 commentaires

En fait, j'ai toujours eu cela activé, juste récemment, j'ai changé les paramètres de Proguard pour montrer des numéros de ligne. Où puis-je ajouter cela? Dans la classe de livre où j'ai eu les cordes / longs?


@ lasagnakid77 J'ai mis à jour ma réponse et j'ai ajouté la classe et comment cela devrait être.


@ lasagneakid77 Parce que les chaînes ne seront pas modifiées après avoir activé la réduction, le @serializedName ("") correspondra au nom des préférences partagées avec la variable Java


Merci beaucoup. Je n'ai aucun moyen de tester s'il le répare, mais si il n'y a pas de crash dans une journée environ, je vais accepter la réponse. Une idée pourquoi cela ne se produit que de certaines personnes? Est-ce que différents téléphones miniment différemment ou quelque chose?


Malheureusement, je n'ai pas d'idée pour ça.



1
votes

Vous pouvez également utiliser cette classe pour votre classe de livre:

ArrayList<Book> books = loadArrayList(this);
Date date = new Date(books.get(0).getStartTime());
Log.i(TAG, "Date: " + date.toString());


0 commentaires