Como atravessar uma estrutura Firebase no Android?

Preciso percorrer o esquema do Firebase para obter dados para cadaworkouts e exibi-lo em um RecyclerView. Agora não consigo atravessar o esquema na Firebase usando o ouvinte e obtê-lo via classe POJO chamadaProgram.

JSON do Firebase

{
  "subscriptions" : {
    "han@gmail,com" : {
      "-KDnhRwHjssOejrqyenP" : {
        "category" : "Strength",
        "goal" : "This workout can be done while on the phone!",
        "length" : 1,
        "title" : "Hello Workouts",
        "weeks" : {
          "week1" : [ "High Knees", "Jumping Jacks", "Wall sit", "Pushups", "Sit-ups", "Step ups", "Squats", "Tricep dips on chair", "Plank", "High Knees running in place", "Lunges", "Pushup and rotation", "Side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "Butt Kickers", "Lying Triceps Lifts", "One Arm Side Push-up", "Overhead Arm Clap", "Overhead Press", "Power Circles", "Push-up and Rotation", "T Push-ups", "Reverse Plank", "Spiderman Push-up", "T Raise", "Tricep Dips", "Wall Push-ups", "Wide Arm Push-ups", "Burpees" ]
        }
      },
      "-KDni3TN4NMyGXePyp92" : {
        "category" : "Strength",
        "goal" : "This workout can be done by a BABUJI",
        "length" : 1,
        "title" : "Indian Workouts",
        "weeks" : {
          "week1" : [ "Diamond Pushups", "Jackknives", "Plyo Lunges", "Plyo Squats", "Single leg plank (alternate per round)", "Plyo Lunges", "Pushup and rotation", "Weighted side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "One Arm Side Push-up", "Overhead Press", "Push-up and Rotation", "T Push-ups", "Spiderman Push-up", "Wide Arm Push-ups", "Burpee Pushups" ]
        }
      }
    },
    "obama@gmsil,com" : {
      "-KDnfjROKeFAL9wccsxY" : {
        "category" : "Mobility",
        "goal" : "afternoon body weight workout",
        "length" : 1,
        "title" : "Afternoon HiiT",
        "weeks" : {
          "week1" : [ "High Knees", "Squats", "Lunges", "Diamond Push-ups", "Lying Triceps Lifts" ]
        }
      },
      "-KDps90Dn6XtJc6Co00b" : {
        "category" : "Strength",
        "goal" : "goal",
        "length" : 1,
        "title" : "title",
        "weeks" : {
          "week1" : [ "Diamond Pushups", "Jackknives", "Plyo Lunges", "Plyo Squats", "Single leg plank (alternate per round)", "Plyo Lunges", "Pushup and rotation", "Weighted side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "One Arm Side Push-up", "Overhead Press", "Push-up and Rotation", "T Push-ups", "Spiderman Push-up", "Wide Arm Push-ups", "Burpee Pushups" ]
        }
      }
    }
  }
  }

CODE do ouvinte

    public void FB(){
ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    for (DataSnapshot postSnapshot: snapshot.getChildren()) {
                        System.out.println(postSnapshot.getValue());
    //Program post = proSnapshot.getValue(Program.class);
                    }
                }
                @Override
                public void onCancelled(FirebaseError firebaseError) {
                    System.out.println("The read failed: " + firebaseError.getMessage());
                }
            });
        }

LOGCAT

03-28 08: 52: 53.966 23584-23584 / com.android.sam I / System.out: {-KDni3TN4NMyGXePyp92 = {weeks = {week1 = [Flexões de diamante, facas, Plyo Lunges, agachamentos Plyo, prancha de perna única (alternativa) por rodada), Plyo Lunges, flexão e rotação, prancha lateral ponderada (alternada por rodada), prancha de flexão alternada, expansor de peito, flexões de diamante, flexões de bombardeiro de mergulho, flexões de bombardeiro de mergulho, flexão lateral de um braço, imprensa aérea, Flexão e rotação, flexões T, flexões do Homem-Aranha, flexões de braço largo, flexões de burpee]}, title = Exercícios indianos, categoria = Força, comprimento = 1, objetivo = Este exercício pode ser realizado por um BABUJI } -KDnhRwHjssOejrqyenP = {weeks = {week1 = [Joelhos altos, Jumping Jacks, Assentos na parede, Flexões, Abdominais, Step ups, Agachamentos, Tricep mergulha na cadeira, Prancha, Joelhos altos correndo no lugar, Lunges, Flexão e rotação , Prancha lateral (alternada por rodada), Prancha de flexão alternada, Expansor de peito, Flexões de diamante, Flexões de bombardeiro de mergulho, Pontapés de bunda, Elevadores mentirosos de tríceps, Flexão lateral de um braço, Aplauso de braço, Imprensa aérea, Círculos de potência, Pus h-up e rotação, flexões T, prancha reversa, flexão Spiderman, elevação T, mergulhos com tríceps, flexões de parede, flexões de braço largo, burpees]}, title = Olá exercícios, categoria = força, comprimento = 1, objetivo = Este exercício pode ser realizado enquanto você estiver ao telefone!}}

03-28 08: 52: 53.967 23584-23584 / com.android.sam I / System.out: {-KDnfjROKeFAL9wccsxY = {weeks = {week1 = [joelhos altos, agachamentos, pulmões, flexões de diamante, elevadores mentirosos para tríceps] }, title = HiiT da tarde, categoria = Mobilidade, comprimento = 1, objetivo = treino com peso corporal à tarde}, -KDps90Dn6XtJc6Co00b = {weeks = {week1 = [Flexões de diamante, navalhas, Plyo Lunges, Plyo Squats, prancha de perna única (alternada por redondo), Plyo Lunges, flexão e rotação, prancha lateral ponderada (alternada por rodada), prancha de flexão alternada, expansor de peito, flexões de diamante, flexões de diamante, flexões de bombardeiro de mergulho, flexão lateral de um braço, sobrecarga, imprensa e Rotação, Flexões T, Flexões do Homem-Aranha, Flexões de Braço Largo, Flexões Burpee]}, title = title, category = Strength, length = 1, goal = goal}}

Program.java

public class Program {
    private String title;

    private String goal;

    private String category;

    private int length;

    HashMap<String, ArrayList<String>> weeks;

    /**
     * Required public constructor
     */
    public Program() {
    }

    public Program(String title, String goal,  String category, int length, HashMap<String, ArrayList<String>> weeks) {
        this.title = title;
        this.goal = goal;
        this.category = category;
        this.length = length;
        this.weeks = weeks;
    }

    public String getTitle() {
        return title;
    }

    public String getGoal() {
        return goal;
    }

    public String getCategory() {
        return category;
    }
    public int getLength() {
        return length;
    }
    public HashMap<String, ArrayList<String>> getweeks() {
        return weeks;
    }    
}

questionAnswers(2)

yourAnswerToTheQuestion