Chcę przenieść obiekt listy za pośrednictwem Google Gson, ale nie wiem, jak dokonać deserializacji typów ogólnych.
Co próbowałem po obejrzeniu tego (odpowiedź BalusC):
MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());
ale wtedy pojawia się błąd w zaćmieniu, mówiąc: „Typ new List () {} musi implementować odziedziczoną metodę abstrakcyjną ...” i jeśli użyję szybkiej poprawki, dostanę potwora ponad 20 kodów pośredniczących metody.
Jestem prawie pewien, że istnieje łatwiejsze rozwiązanie, ale wydaje się, że nie jestem w stanie go znaleźć!
Edytować:
Teraz mam
Type listType = new TypeToken<List<MyClass>>()
{
}.getType();
MyClass mc = new Gson().fromJson(result, listType);
Jednak w wierszu „fromJson” pojawia się następujący wyjątek:
java.lang.NullPointerException
at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47)
at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:56)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88)
at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:76)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106)
at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:64)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:49)
at com.google.gson.Gson.fromJson(Gson.java:568)
at com.google.gson.Gson.fromJson(Gson.java:515)
at com.google.gson.Gson.fromJson(Gson.java:484)
at com.google.gson.Gson.fromJson(Gson.java:434)
I zrobić JsonParseExceptions połowów i „wynik” nie jest null.
Sprawdziłem listType za pomocą debugera i otrzymałem następujące informacje:
- typ listy
- args = ListOfTypes
- list = null
- resolvedTypes = Typ [1]
- loader = PathClassLoader
- ownerType0 = null
- ownerTypeRes = null
- rawType = Klasa (java.util.ArrayList)
- rawTypeName = "java.util.ArrayList"
- args = ListOfTypes
więc wygląda na to, że wywołanie „getClass” nie działało poprawnie. Jakieś sugestie...?
Edycja2: Sprawdziłem w Podręczniku użytkownika Gson . Wspomina wyjątek czasu wykonywania, który powinien wystąpić podczas analizowania typu ogólnego dla Jsona. Zrobiłem to „źle” (nie pokazano powyżej), tak jak w przykładzie, ale w ogóle nie dostałem tego wyjątku. Zmieniłem więc serializację zgodnie z sugerowanym podręcznikiem użytkownika. Jednak nie pomogło.
Edycja3: Rozwiązane, patrz moja odpowiedź poniżej.
TokenType
. Próbowałeś w ten sposób?