RuntimeException in Gson beim Parsen von JSON: Fehler beim Aufrufen von protected java.lang.ClassLoader () ohne Argumente

7

Ich habe einen Code geerbt, der unseren Anwendungsstatus unter Verwendung von Gson als JSON speichert und dann mit vonJson .

%Vor%

Eines der Felder, die gespeichert werden, ist ein Standort . Leider schlägt das Parsen dieser gespeicherten Daten sehr selten fehl, da mein gespeicherter Standort einen mClassLoader in seinen mExtras enthält und die Gson-Bibliothek den ClassLoader mit diesem Fehler nicht erstellen kann:

  

RuntimeException: Fehler beim Aufrufen von protected java.lang.ClassLoader () ohne Argumente

Weiß jemand, warum ein ClassLoader in den Extras für meinen Standort enthalten ist und ob er in der JSON-Darstellung enden sollte?

Ich gehe davon aus, dass ich das beheben kann, indem ich die Schlüsselfelder aus dem Location-Objekt einzeln speichere (zB Länge, Breite, Höhe, Zeit, Genauigkeit), aber es wäre schön, wenn möglich das Location-Objekt zu speichern / p>

Ich habe gesehen, dass es eine ExclusionStrategy Objekt, das ich verwenden könnte, um Felder auszuschließen, aber ich war mir nicht sicher, ob ich das verwenden könnte / sollte, um die Extras aus meinem Standort auszuschließen ...

Zu Ihrer Information, hier sind die JSON-Daten für mein Location-Objekt (mit Längen- und Breitengrad, um mich zu verbergen):

%Vor%

Hier ist ein Beispiel, was die mExtras enthält, wenn der Code nicht abstürzt:

%Vor%     
Dan J 19.12.2012, 01:38
quelle

2 Antworten

19

Das Problem ist, dass Sie gerade versuchen, eine vom System bereitgestellte Klasse ( Location ) in JSON umzuwandeln. Und wie Sie sehen, stoßen Sie auf Probleme mit der Serialisierung von internen State / Java-spezifischen Dingen. JSON ist als semi-generische Methode gedacht, um Informationen weiterzugeben.

Sie können die @Expose Annotation nicht einfach verwenden, da dies nicht Ihre Klasse ist. das würde erfordern, den Quellcode für Location zu modifizieren oder über einen ziemlich umfangreichen Prozess, sie zur Laufzeit hinzuzufügen, indem man jassist verwendet (siehe: < a href="http://ayoubelabbassi.blogspot.com/2011/01/how-to-add-annotations-at-runtime-to.html"> Ссылка )

Wenn ich auf die Klasse Location schaue, würde ich einfach einen benutzerdefinierten Gson Serializer und Deserializer erstellen und damit fertig sein. Was Sie eigentlich interessiert, sind die GPS-Daten, nicht die Interna der Klasse selbst. Sie erstellen einfach den JSON, der die benötigten Informationen enthält, mit den Gettern im Serializer, dann erstellen Sie im Deserializer eine neue Instanz von Location und füllen sie mit den Informationen aus dem mitgelieferten JSON unter Verwendung der öffentlichen Setter.

%Vor%

Nun benutzen Sie in Ihrem Code GsonBuilder und registrieren die Klassen:

%Vor%

Das sollte sich ziemlich darum kümmern.

    
Brian Roach 21.12.2012, 22:19
quelle
2

Erwägen Sie, ein benutzerdefiniertes Objekt zu erstellen, das Ihr GSON modelliert, indem Sie das Inhaltsobjekt pro Objekt und Feld pro Feld analysieren

etwas wie

%Vor%

Damit können Sie die volle Kontrolle über das Parsing erhalten und einen try \ catch-Block im kritischen mExtra-Teil hinzufügen, den Sie den Block ausschließen oder die Exception ganz einfach verwalten können.

    
Silverstorm 23.12.2012 01:27
quelle

Tags und Links