gpt4 book ai didi

java - 无法在 Gson 自定义解串器中初始化 Android.Util.Pair

转载 作者:行者123 更新时间:2023-11-30 00:42:55 27 4
gpt4 key购买 nike

我正在创建一个 custom deserializer对于我当前应用程序中的数据模型,我在尝试初始化 Pair<> 时遇到了一些问题在我的里面 CustomDeserializer .我从我的 Json 中恢复了我的项目 A 和 B,它们很好并且从 JsonObject 正确初始化,但是当我想创建一个 new Pair<>(A,B)与他们一起我得到一个异常(exception):

Method threw 'java.lang.RuntimeException' exception. Cannot evaluate 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<> .

最佳答案

在您的 Junit 测试中,您不能引用 android 代码 (android.util.Pair),因为此测试是在您的本地 jvm 中执行的,并且没有要初始化的此类。

考虑使用 Robolectric lib 来模拟 android 类,或者在你的代码中抽象它们并且不要使用具体化(Android 框架类)并使用这个抽象并用 Mockito 模拟它们。

关于java - 无法在 Gson 自定义解串器中初始化 Android.Util.Pair,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42277629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com