RuntimeException in Gson Parsen von JSON: Fehler beim aufrufen der geschützten java.lang.ClassLoader() ohne Argumente
Habe ich geerbt, einige code, der spart, unser Zustand der Anwendung als JSON mit Gson, und dann liest Sie mit fromJson.
Gson gson = createGson();
gson.fromJson(objString, myClass);
Eines der Felder gespeichert werden, ist eine Lage. Leider sehr selten der Analyse, dass gespeicherte Daten nicht, weil meine gespeicherte Position umfasst eine mClassLoader in seiner mExtras, und die Gson-Bibliothek nicht erstellen der ClassLoader mit diesem Fehler:
RuntimeException: Failed to invoke geschützt java.lang.ClassLoader() ohne Argumente
Weiß jemand, warum ein ClassLoader ist in den extras für meine Lage, und ob es schließlich in die JSON-Darstellung?
Ich nehme an, ich kann dieses Problem beheben, indem Sie einfach speichern Sie die key-Felder aus dem Location-Objekt individuell (z.B. Längengrad, Breitengrad, Höhe, Zeit, Genauigkeit), aber es wäre schön, zu retten aus dem Location-Objekt, wenn möglich.
Ich sah, es ist ein ExclusionStrategy Objekt, die ich verwenden könnte, um auszuschließen Felder, aber ich war nicht sicher, ob ich das könnte/sollte man verwenden, um auszuschließen das die extras aus in meine Lage...
FYI, hier ist die JSON-Daten für meine Location-Objekt (mit den Längen-und Breitengrad verändert sich zu verstecken mich):
{
<snip>
"lastKnownLocation": {
"mResults": [
0,
0
],
"mProvider": "gps",
"mExtras": {
"mParcelledData": {
"mOwnObject": 1,
"mObject": 5525040
},
"mClassLoader": {
"packages": {}
},
"mMap": {},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
},
"mDistance": 0,
"mTime": 1354658984849,
"mAltitude": 5.199999809265137,
"mLongitude": -122.4376,
"mLon2": 0,
"mLon1": 0,
"mLatitude": 37.7577,
"mLat1": 0,
"mLat2": 0,
"mInitialBearing": 0,
"mHasSpeed": true,
"mHasBearing": false,
"mHasAltitude": true,
"mHasAccuracy": true,
"mAccuracy": 16,
"mSpeed": 0,
"mBearing": 0
},
<snip>
}
Hier ist ein Beispiel, was die mExtras enthält, wenn der code nicht abstürzt:
"mExtras": {
"mParcelledData": {
"mOwnsNativeParcelObject": true,
"mNativePtr": 1544474480
},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist man versucht, einfach direkt konvertieren von einem system bereitgestellte Klasse (
Location
) zu JSON. Und, wie Sie sehen, Sie laufen in Probleme mit dem serialisieren internen Zustand /Java-spezifische Dinge. JSON ist gedacht als ein semi-generische Methode zum übergeben von Informationen rund um.Können Sie nicht verwenden, die
@Expose
annotation einfach, weil es nicht Ihre Klasse; erfordern würde, dass änderungen am Quellcode fürLocation
oder über einen ziemlich umfangreichen Prozess der das hinzufügen zur Laufzeit mit jassist (siehe: http://ayoubelabbassi.blogspot.com/2011/01/how-to-add-annotations-at-runtime-to.html)Blick auf die
Location
Klasse, ich würde einfach erstellen Sie eine benutzerdefinierte Gson Serializer und Deserializer und mit ihm getan werden. Was bist du eigentlich interessiert, ist die GPS-Daten nicht auf Interna der Klasse selbst. Sie gerade erstellen der JSON enthält die Informationen, die Sie in den serializer mit dem Getter, dann in die Deserializer, die Sie erstellen eine neue Instanz derLocation
und füllen Sie es mit den Informationen aus der mitgelieferten JSON mit Hilfe der öffentlichen Set-Methoden.Nun in Ihrem code, den Sie verwenden
GsonBuilder
und registrieren der Klassen:Sollte ziemlich viel kümmern.
Betrachten Sie ein benutzerdefiniertes Objekt erstellen, dass die Modelle Ihre GSON, analysieren den content-Objekt pro Objekt und Feld pro Feld
etwas wie
So erhalten Sie die volle Kontrolle über die Analyse und das hinzufügen eines try\catch-block in der kritischen mExtra Teil können Sie ausschließen, dass der block, oder die Verwaltung der Ausnahme, wie Sie wollen, ganz einfach.