私の現在のアプリケーションでデータモデルにcustom deserializer
を作成しています。Pair<>
をCustomDeserializer
に初期化しようとすると問題が発生します。私は私のJSONの私の項目AとBから回復し、彼らは罰金と正しくJsonObject
から初期化されているが、私は彼らとnew Pair<>(A,B)
を作成したいとき、私は例外を取得しています:Gsonカスタムデシリアライザ内でAndroid.Util.Pairを初期化できません
方法は、「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
を取得しますnull Pair<>
。
誰かが私に手を差し伸べることができると願っています!