Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing Objects/Arrays from JSON to Java

Tags:

I'm new to JSON and I'm trying to parse my JSON File into Java, and it works, but I've got Objects/Arrays that contains more arrays and I don't know how to iterate it correctly. This is my JSON File:

{
    "quiz": {
        "sport": {
            "q1": {
                "question": "Which one is correct team name in NBA?",
                "options": [
                    "New York Bulls",
                    "Los Angeles Kings",
                    "Golden State Warriros",
                    "Huston Rocket"
                ],
                "answer": "Huston Rocket"
            }
        },
        "maths": {
            "q1": {
                "question": "5 + 7 = ?",
                "options": [
                    "10",
                    "11",
                    "12",
                    "13"
                ],
                "answer": "12"
            },
            "q2": {
                "question": "12 - 8 = ?",
                "options": [
                    "1",
                    "2",
                    "3",
                    "4"
                ],
                "answer": "4"
            }
        }
    }
}

I don't know how I can get all data in this structure. I mean that I know it's a quiz and the two topics are sport and maths and that each topic has questions and an answer.

I would like to have each value avaiable.

This is my Java Code

JSONParser jsonParser = new JSONParser();

        try
        {

                JSONArray a = (JSONArray) jsonParser.parse("pathToFile");
                for (Object o : a)
                {
                    JSONObject task1 = (JSONObject) o;
                    String name = (String) task1.get("quiz");
                    System.out.println(name);

                    String topic = (String) task1.get("sport");
                    System.out.println(topic);

                }

        }catch (ParseException e)
        {
            e.printStackTrace();
        }
       catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

Can someone explain the logic to me?

like image 347
Marie_Jane98 Avatar asked Jan 30 '20 15:01

Marie_Jane98


1 Answers

Assuming you don't want to use GSON and let loose your own logic on handling the quiz objects:
Analyze the JSON and create them logical objects for the values. Then when you read the JSON, you create the objects as required and attach them as needed.

You'd need a Quiz, Category, Question and Option objects.

then your code would become something like this(psuedo code, not tested if it actually works):

 public Quiz createQuiz(JSONObject raw) 
 {
     Quiz quiz = new Quiz();

     Iterator<String> keys = raw.keys();
     while(keys.hasNext()) {
        String key = keys.next();
        if (raw.get(key) instanceof JSONObject) { 
           JSONObject rawCategory = (JSONObject)raw.get(key);
           quiz.addCategory(this.createCategory(key, rawCategory));
        }
    } 
    return quiz;
}
public Category createCategory(String name, JSONObject raw) 
{
    Category category = new Category(name);
    Iterator<String> keys = raw.keys();
     while(keys.hasNext()) {
        String key = keys.next();
        if (raw.get(key) instanceof JSONObject) { 
           JSONObject rawQuestion = (JSONObject)raw.get(key);
           category.addQuestion(this.createQuestion(key, rawQuestion));
        }
    } 
   return category;
}

public Category createQuestion(String name, JSONObject raw) 
{
    Question question = new Question(name);
    if(raw.hasKey("question") && raw.get("question") instanceof String) {
       question.setQuestionText((String) raw.get("question"));
    }
    if(raw.hasKey("answer") && raw.get("answer") instanceof String) {
       question.setAnswerText((String) raw.get("answer"));
    }
    if(raw.hasKey("options") && raw.get("options") instanceof JSONArray) {
       JSONArray rawOptions = (JSONArray)raw.get("options");
       for(Object rawOption : rawOptions) {
          if(rawOption instanceof String) {
             question.addOption(this.createOption((String) rawOption));
          } 
       }
    }
   return question;
}
like image 152
Tschallacka Avatar answered Sep 19 '22 22:09

Tschallacka