Я создаю для моей модели данных custom deserializer
, и у меня возникают некоторые проблемы при попытке инициализировать Pair<>
внутри моего CustomDeserializer
. Я оправиться от моего Json моих пунктов А и В, они отлично и правильно инициализированы с JsonObject
, но когда я хочу, чтобы создать new Pair<>(A,B)
с ними я получаю исключение:Невозможно инициализировать Android.Util.Pair внутри настраиваемого десериализатора Gson
Метод бросил «java.lang Исключение .RuntimeException '. Не могу оценить android.util.Pair.toString()
Я смотрел больше людей с той же проблемой, но я не могу найти любой совет по этому поводу, я не знаю, почему я не могу инициализировать элемент внутри deserializer
. Я выполняю весь свой код внутри теста junit
, так что, возможно, это вызвано этим, но я не знаю почему. Вот код моего 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");
}
}
А вот мой тест:
@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));
}
Если я отладки мой код все работает отлично, но Pair<>
никогда не создается, так что я всегда извлекать List
полный от нуля Pair<>
.
Надеюсь, что кто-то сможет дать мне руку!