initialisiert werden Ich erstelle ein custom deserializer
für mein Datenmodell in meiner aktuellen Anwendung, und ich bekomme einige Probleme beim Versuch, eine Pair<>
in meinem CustomDeserializer
zu initialisieren. Ich erhole mich von meiner Json meine Einzelteile A und B, sie sind in Ordnung und korrekt aus dem JsonObject
initialisiert, aber wenn ich ein new Pair<>(A,B)
mit ihnen zu erstellenden Ich erhalte eine Ausnahme:Android.Util.Pair kann nicht in Gson benutzerdefinierter Deserializer
Methode warf ‚java.lang .RuntimeException 'Ausnahme. Kann nicht android.util.Pair.toString bewerten()
Ich habe, um mehr Menschen mit dem gleichen Problem aus, aber ich kann jeden Tipp über diese nicht finden, ich weiß nicht, warum ich nicht das Element initialisieren innerhalb der deserializer
. Ich führe meinen gesamten Code innerhalb eines junit
Tests aus, also wird es vielleicht dadurch verursacht, aber ich weiß nicht warum. Hier ist der Code meiner deserializer
:
public class CustomSetDeserializer implements JsonDeserializer<ExerciseSet> {
private List<Exercise> exerciseList;
public CustomSetDeserializer(List<Exercise> exerciseList) {
this.exerciseList = exerciseList;
}
@Override
public ExerciseSet deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
List<Pair<Exercise, Integer>> setExercises = new ArrayList<>();
JsonArray exercisesJsonArray = json.getAsJsonObject().get("exercises").getAsJsonArray();
for (JsonElement jsonElement : exercisesJsonArray) {
String name = jsonElement.getAsJsonObject().get("name").getAsString();
int reps = jsonElement.getAsJsonObject().get("reps").getAsInt();
Exercise exercise = getExercise(name);
setExercises.add(new Pair<>(exercise, reps));
}
int exercisesPerRound = json.getAsJsonObject().get("exercisesPerRound").getAsInt();
int restBetweenRounds = json.getAsJsonObject().get("restBetweenRounds").getAsInt();
ExerciseSet set;
switch (exercisesPerRound) {
case 3:
//TODO TRISET
set = new SimpleSet(setExercises, restBetweenRounds);
break;
case 2:
//TODO SUPERSET
set = new SimpleSet(setExercises, restBetweenRounds);
break;
default:
set = new SimpleSet(setExercises, restBetweenRounds);
break;
}
return set;
}
private Exercise getExercise(String name){
for (Exercise exercise : exerciseList) {
if (!exercise.name().equals(name)) continue;
return exercise;
}
throw new IllegalArgumentException("Wrong exercise name");
}
}
Und hier ist mein Test:
@Test
public void read_set_json() {
CustomSetDeserializer customSetDeserializer = new CustomSetDeserializer(exercises);
Gson gson = new GsonBuilder().registerTypeAdapter(ExerciseSet.class, customSetDeserializer).enableComplexMapKeySerialization().create();
ExerciseSet set = gson.fromJson(setExample, ExerciseSet.class);
assertThat(set.exercises().get(0).first.equals(exercise), is(true));
assertThat(set.exercises().get(0).second.equals(12), is(true));
assertThat(set.rounds(), is(4));
assertThat(set.restBetweenRound(), is(60L));
}
Wenn ich meinen Code funktioniert alles einwandfrei debuggen, aber die Pair<>
nie erstellt, so dass ich abrufen immer eine List
voll von null Pair<>
.
Hoffe, dass mir jemand helfen kann!