Чтение JsonFile в ArrayList - PullRequest
0 голосов
/ 01 июля 2019

У меня есть задание создать что-то похожее на викторину. Учитель дал нам все интерфейсы для Вопросы и Тест и даже "графический слой" для отображения теста .

Я создал два класса для интерфейсов Тест и Вопрос. Тестовый класс имеет объект listArray of Questions вместе с другими атрибутами. Класс Question содержит атрибуты, которые можно увидеть в файле JSON (заголовок, оценка, оценка и т. Д.).

Чтобы прочитать файл Json, я создал метод «loadfromJsonFile», и он прекрасно печатает файл, но я не могу понять, как связать каждый объект вопроса из файла с arrayList.

Файл Json:

[
{
    "type": "MultipleChoice",
    "question": {
        "title": "Question 1",
        "score": 4,
        "mark":  5,
        "question_description": "The ability of an object to take on many forms is:",
        "options": [
            "Polymorphism",
            "Encapsulation",
            "Design Patter",
            "Does not Exist"
        ],
        "correct_answer": "Polymorphism"
    }
},

{
    "type": "MultipleChoice",
    "question": {
        "title": "Question 2",
        "score": 4,
        "mark":  5,
        "question_description": "The bundling of data with the methods that operate on that data is:",
        "options": [
            "Polymorphism",
            "Encapsulation",
            "Design Patter",
            "Does not Exist"
        ],
        "correct_answer": "Encapsulation"
    }
},
{
    "type": "YesNo",
    "question": {
        "title": "Question 3",
        "score": 4,
        "mark":  5,
        "question_description": "Object Oriented Programming is exclusive to the JAVA programming language",
        "correct_answer": "no"
    }
},
{
    "type": "Numeric",
    "question": {
        "title": "Question 4",
        "score": 4,
        "mark":  5,
        "question_description": "How many programming languages are taught in Paradigmas de Programação?",
        "correct_answer": "1"
    }
}]

Код для чтения файла Json:

public boolean loadFromJSONFile(String s) throws TestException {
    String path = "teste_A.json";
    BufferedReader reader = null;

    try{
        reader = new BufferedReader(new FileReader(path));

        JsonStreamParser p = new JsonStreamParser(reader);
        JsonArray arr = (JsonArray) p.next();

        for(int i=0;i<arr.size();i++){
            System.out.println("--------------------------------------Question"+i+"--------------------------------------------");
            JsonElement arrayElement = arr.get(i);
            JsonObject obj = arrayElement.getAsJsonObject();
            String type=obj.get("type").getAsString();
            System.out.println("Type: " + type);
            JsonObject list =obj.get("question").getAsJsonObject();
            String title=list.get("title").getAsString();
            System.out.println("Title: " + title);
            int score=list.get("score").getAsInt();
            System.out.println("Score: " + score);
            int mark=list.get("mark").getAsInt();
            System.out.println("Mark: " + mark);
            String Description=list.get("question_description").getAsString();
            System.out.println("Description: " + Description);
            JsonArray opt = list.getAsJsonArray("options");
            if(opt!=null){
                System.out.println("Options: \n");
                for (int j = 0; j < opt.size(); j++) {
                    JsonPrimitive value = opt.get(j).getAsJsonPrimitive();
                    System.out.print("      Option"+ (j+1) +": "+ value.getAsString()+ " \n");
                }
                System.out.println("\n");
            }

            String CorrectAnswer = list.get("correct_answer").getAsString();
            System.out.println("Correct: " + CorrectAnswer);
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            reader.close();
        }catch (IOException ex){
            ex.printStackTrace();
        }
    }


    return false;
}

1 Ответ

0 голосов
/ 01 июля 2019

Вот мое понимание: вы можете прочитать файл json и просто разобрать содержимое, но проблема в том, как передать результаты обратно вызывающей стороне, не возвращая сам параметр. Из фрагментов кода, строка this.current_question = this.test.getQuestion(this.question_number); похоже, где этот ArrayList будет запрашиваться в программе.

Исходя из этого, я представляю себе пару возможностей:

1) Существует метод setQuestion(<params>), который можно вызвать в предоставленном учителем коде.

2) Существует переменная, такая как this.test или this.questions, которую вы должны установить.

В любом случае вы бы добавили каждый вопрос в цикл for. Например,

for(int i=0;i<arr.size();i++){
            System.out.println("--------------------------------------Question"+i+"--------------------------------------------");
            JsonElement arrayElement = arr.get(i);
            JsonObject obj = arrayElement.getAsJsonObject();
            //add obj via variable assignment
            this.test.Add(obj);
            //or, add obj via set method
            this.test.setQuestion(i, obj); //or whatever parameters are needed :)

EDIT:

Поскольку ваш класс Question расширяет IQuestion, вы можете привести экземпляр класса Question к IQuestion. Кроме того, класс Question использует библиотеку Gson для десериализации для вас, что означает, что вы сэкономили себе немного труда. (Яй!)

for(int i=0;i<arr.size();i++){
            //get the whole json array element
            JsonElement arrayElement = arr.get(i);
            //...
            //get question object
            JsonObject list = obj.get("question").getAsJsonObject();
            //cast to IQuestion using the Question class Gson deserializer
            IQuestion q = new Gson().fromJson(list, Question.class);
            //And, add using built in method
            this.test.setQuestion(q);

На этом сайте есть несколько примеров десериализации Gson, один из которых я использовал выше.

EDIT:

После добавления конструктора в класс Question для кода для добавления вопроса о конкретных типах потребуется приведение типов.

for(int i=0;i<arr.size();i++){
            //get the whole json array element
            JsonElement arrayElement = arr.get(i);
            //...
            //get question object
            JsonObject list = obj.get("question").getAsJsonObject();
            //cast question to correct interface based on question type
            if (type=="Multiple Choice") {
               IQuestionMultipleChoice questionMP = (IQuestionMultipleChoice) new Question(<params>);
               this.test.setQuestion(questionMP);
            } else if(type=="Yes/No") {
               //...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...