Разбор объектов / массивов от JSON до Java - PullRequest
6 голосов
/ 30 января 2020

Я новичок в JSON, и я пытаюсь разобрать мой файл JSON в Java, и это работает, но у меня есть объекты / массивы, которые содержат больше массивов, и я не знаю, как правильно это повторить. Это мой JSON файл:

{
    "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"
            }
        }
    }
}

Я не знаю, как мне получить все данные в этой структуре. Я имею в виду, что я знаю, что это викторина и две темы - спорт и математика, и что у каждого топи c есть вопросы и ответ.

Я бы хотел, чтобы каждое значение было доступно.

Это мой Java код

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();
        }

Может кто-нибудь объяснить мне логику c?

Ответы [ 2 ]

3 голосов
/ 30 января 2020

Предполагая, что вы не хотите использовать GSON и потерять свои собственные логики c при обработке объектов викторины:
Проанализируйте JSON и создайте для них логические объекты для значений. Затем, когда вы читаете JSON, вы создаете необходимые объекты и присоединяете их по мере необходимости.

Вам потребуются объекты Quiz, Category, Question и Option.

, затем ваш код станет что-то вроде этого (код psuedo, не проверен, если он действительно работает):

 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;
}
3 голосов
/ 30 января 2020

Во-первых, вам нужно создать класс, проще сравнить объект

Эта ссылка может помочь вам преобразовать json в классы

https://www.site24x7.com/tools/json-to-java.html

Это сгенерированные классы

/ * * Чтобы изменить этот заголовок лицензии, выберите заголовки лицензий в свойствах проекта. * Чтобы изменить этот файл шаблона, выберите Инструменты | Шаблоны * и откройте шаблон в редакторе. * / package com.examen.overflow;

/**
 *
 * @author wilso
 */
public class Dto {

    private Quiz quiz;

    public Quiz getQuiz() {
        return quiz;
    }

    public void setQuiz(Quiz quiz) {
        this.quiz = quiz;
    }
}


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.examen.overflow;

/**
 *
 * @author wilso
 */
public class Maths {

    private Question q1;
    private Question q2;

    // Getter Methods 
    public Question getQ1() {
        return q1;
    }

    public Question getQ2() {
        return q2;
    }

    // Setter Methods 
    public void setQ1(Question q1) {
        this.q1 = q1;
    }

    public void setQ2(Question q2) {
        this.q2 = q2;
    }
}


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.examen.overflow;

import java.util.List;

/**
 *
 * @author wilso
 */
public class Question {

    private String answer;
    private List<String> options;
    private String question;

    public String getAnswer() {
        return answer;
    }

    public void setAnswer(String answer) {
        this.answer = answer;
    }

    public List<String> getOptions() {
        return options;
    }

    public void setOptions(List<String> options) {
        this.options = options;
    }

    public String getQuestion() {
        return question;
    }

    public void setQuestion(String question) {
        this.question = question;
    }

}


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.examen.overflow;

/**
 *
 * @author wilso
 */
public class Quiz {

    private Sport sport;
    private Maths maths;

    public Sport getSportObject() {
        return sport;
    }

    public void setSportObject(Sport sport) {
        this.sport = sport;
    }

    public Maths getMathsObject() {
        return maths;
    }

    public void setMathsObject(Maths maths) {
        this.maths = maths;
    }

}


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.examen.overflow;

/**
 *
 * @author wilso
 */
public class Sport {

    Question q1;

    // Getter Methods 
    public Question getQ1() {
        return q1;
    }

    // Setter Methods 
    public void setQ1(Question question) {
        this.q1 = question;
    }
}

Когда у вас есть классы, вам нужно только сделать следующее

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.examen.overflow;

import com.google.gson.Gson;

public class Convert {

    public static void main(String[] args) {
        String json = "{\n"
                + "    \"quiz\": {\n"
                + "        \"sport\": {\n"
                + "            \"q1\": {\n"
                + "                \"question\": \"Which one is correct team name in NBA?\",\n"
                + "                \"options\": [\n"
                + "                    \"New York Bulls\",\n"
                + "                    \"Los Angeles Kings\",\n"
                + "                    \"Golden State Warriros\",\n"
                + "                    \"Huston Rocket\"\n"
                + "                ],\n"
                + "                \"answer\": \"Huston Rocket\"\n"
                + "            }\n"
                + "        },\n"
                + "        \"maths\": {\n"
                + "            \"q1\": {\n"
                + "                \"question\": \"5 + 7 = ?\",\n"
                + "                \"options\": [\n"
                + "                    \"10\",\n"
                + "                    \"11\",\n"
                + "                    \"12\",\n"
                + "                    \"13\"\n"
                + "                ],\n"
                + "                \"answer\": \"12\"\n"
                + "            },\n"
                + "            \"q2\": {\n"
                + "                \"question\": \"12 - 8 = ?\",\n"
                + "                \"options\": [\n"
                + "                    \"1\",\n"
                + "                    \"2\",\n"
                + "                    \"3\",\n"
                + "                    \"4\"\n"
                + "                ],\n"
                + "                \"answer\": \"4\"\n"
                + "            }\n"
                + "        }\n"
                + "    }\n"
                + "}";
        Dto quiz = new Gson().fromJson(json, Dto.class);
        System.out.println(quiz);
        //Iterate object
        for (String option : quiz.getQuiz().getMathsObject().getQ1().getOptions()) {
            System.out.println(option);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...