2017-02-16 3 views
1

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!

Antwort

1

In Ihrem Junit-Test können Sie nicht auf Android-Code (android.util.Pair) verweisen, da dieser Test in Ihrem lokalen jvm ausgeführt wird und diese Klasse nicht initialisiert werden muss.

Verwenden Sie Robolectric Lib, um Android-Klassen zu verspotten, oder abstrahieren Sie sie in Ihrem Code und nicht Konkretionen (Android Framework-Klasse) und verwenden Sie diese Abstraktionen und verspotten sie mit Mockito.

Verwandte Themen