Запись значений в несколько объектов JSON

java #json #file

#java #json #файл

Вопрос:

Я создаю приложение для викторины, в котором пользователь может ответить на несколько вопросов, выбрав один вариант из a, b, c, d. Прямо сейчас, когда пользователь вводит свой ответ на вопрос, ответ сохраняется в ArrayList, но я хочу, чтобы он сохранялся как значения для ключейв объекте JSON. В настоящее время мой файл JSON выглядит следующим образом:

 [  
  {"Q1":  ""},  
  {"Q2":  ""},  
  {"Q3":  ""},  
  {"Q4":  ""},  
  {"Q5":  ""},  
  {"Q6":  ""},  
  {"Q7":  ""},  
  {"Q8":  ""},  
  {"Q9":  ""},  
  {"Q10":  ""},  
  {"Q11":  ""},  
  {"Q12":  ""},  
  {"Q13":  ""},  
  {"Q14":  ""},  
  {"Q15":  ""}  
]
 

Вот код для получения ответов от пользователя:

    public ArrayList<String> askQuestionsOneByOne() {
    QuizQuestions qq = new QuizQuestions();
    Set<Map.Entry<String, String>> entry = qq.entireQuestionsList().entrySet();
    ArrayList<String> userAnswer = new ArrayList<>();
    for (Object o : entry) {
        System.out.println(o);
        String answer = askUser();
        askUserIfHeWantsToQuit();
        userAnswer.add(answer);
    }
    return userAnswer;
}
 

Когда пользователь вводит ответ, я хочу, чтобы этот ответ был сохранен в соответствующем значении вопроса в этом файле вместо пустой строки, но я не знаю, как это сделать. Я был бы признателен за рекомендации по этому поводу.

Спасибо

Комментарии:

1. было бы намного проще, если бы вы могли рассказать нам, как кодируются данные, которые вы получаете от пользователя, или поделиться с нами частью кода, которая получает ответы от пользователя

2. Я отредактировал свой вопрос и добавил это!

3. Пожалуйста, напишите это более четко. Что такое ввод и какой ожидаемый результат?

4. Ввод — это ввод пользователя для конкретного вопроса, одной из строк «a», «b», «c», «d». Я хочу, чтобы эти строки были добавлены в файл json в качестве значений для ключей для соответствующего вопроса. Например, если для первого вопроса пользователь вводит ответ как «a», то в файле json это будет выглядеть так: [ {«Q1»: «a»} ] Дайте мне знать, если вам нужно больше ясности!

Ответ №1:

Вам нужно использовать библиотеку json, такую как org.json, создать JSONArray и заполнить его JSONObjects , предполагая, что я правильно понимаю структуру, то, что вы называете объектом o, на самом деле является Map.Entry<String, String> , который вы можете использовать для получения ключа и значения,Я полагаю, что в ключе будет вопрос (Q1, Q2, Q3 …), который вы можете использовать для добавления объектов в JSONArray

 JSONArray arr = new JSONArray();
    
for (Map.Entry<String, String> o: entry) {
    String answer = askUser();
    
    JSONObject answerObject = new JSONObject();
    answerObject.put(o.getKey(), answer);
    
    arr.put(answerObject);
}

System.out.println(arr.toString(4));
 

вывод:

 [
    {"Q1": "c"},
    {"Q2": "a"},
    {"Q3": "b"},
    {"Q4": "b"},
    {"Q5": "c"}
]
 

Комментарии:

1. Спасибо за ответ! Это именно то, что я хочу, за исключением того факта, что я не хочу добавлять ответы вручную, как вы описали здесь . Я хочу, чтобы они автоматически добавлялись к соответствующему вопросу по мере того, как пользователь отвечает на него.

2. я бы не сказал, что это невозможно, но имейте в виду, что наборы java неупорядочены, поэтому даже мой ответ может вызвать проблемы из-за порядка, мне нужно больше информации о структуре вопросов (что возвращает entireQuestionsList())

3. entireQuestionsList() возвращает LinkedHashMap<Строка, строка>, где первая строка — это вопрос, а вторая строка состоит из 4 вариантов ответа на этот вопрос.

4. я отредактировал ответ

Ответ №2:

JSON — это формат файла, который позволяет передавать объекты между различными программами, даже если они используют разные языки программирования. Если вы действительно хотите получить решение в такой форме, вам нужно использовать какую-нибудь библиотеку, предоставляющую сервис JSON (я рекомендую GSON от себя). Код из решения в нужной вам форме: сначала вам нужно создать класс (например, ответы):

 public class Answers {
    String Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15;

    public void setQ1(String q1) {
        Q1 = q1;
    }

    public void setQ2(String q2) {
        Q2 = q2;
    }

    public void setQ3(String q3) {
        Q3 = q3;
    }

    public void setQ4(String q4) {
        Q4 = q4;
    }

    public void setQ5(String q5) {
        Q5 = q5;
    }

    public void setQ6(String q6) {
        Q6 = q6;
    }

    public void setQ7(String q7) {
        Q7 = q7;
    }

    public void setQ8(String q8) {
        Q8 = q8;
    }

    public void setQ9(String q9) {
        Q9 = q9;
    }

    public void setQ10(String q10) {
        Q10 = q10;
    }

    public void setQ11(String q11) {
        Q11 = q11;
    }

    public void setQ12(String q12) {
        Q12 = q12;
    }

    public void setQ13(String q13) {
        Q13 = q13;
    }

    public void setQ14(String q14) {
        Q14 = q14;
    }

    public void setQ15(String q15) {
        Q15 = q15;
    }
}
 

Затем вам нужно создать объект класса Answers, который будет обрабатывать ответы и преобразовывать его в JSON (например, используя GSON):

 Answers answers = new Answers();
    //somehow set the values (maybe by using Scanner.in?)
        answers.setQ1("YES");
        answers.setQ2("YES");
        answers.setQ3("NO");
        answers.setQ4("NO");
        answers.setQ5("dog");
        answers.setQ6("Giraffe");
        answers.setQ7("Gson");
        answers.setQ8("Java");
        answers.setQ9("CSS");
        answers.setQ10("NO");
        answers.setQ11("Maven");
        answers.setQ12("dog");
        answers.setQ13("Elephant");
        answers.setQ14("Gson");
        answers.setQ15("No");
    //using Gson
        String json_file;
        Gson g = new Gson();
        json_file = g.toJson(answers);
    // to file
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("answers.json"));
            writer.write(json_file);

            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
 

файл .json:

 {
  "Q1": "YES",
  "Q2": "YES",
  "Q3": "NO",
  "Q4": "NO",
  "Q5": "dog",
  "Q6": "Giraffe",
  "Q7": "Gson",
  "Q8": "Java",
  "Q9": "CSS",
  "Q10": "NO",
  "Q11": "Maven",
  "Q12": "dog",
  "Q13": "Elephant",
  "Q14": "Gson",
  "Q15": "No"
}
 

Однако, на мой взгляд, код, который удовлетворяет вашей идее, слишком сложен, и я настоятельно рекомендую пересмотреть его. Возможно, было бы лучше использовать класс Answers с некоторой информацией о человеке, который играет в викторину, и гораздо более чистым строковым массивом ответов вместо разных переменных для каждого. Программист всегда должен пытаться найти способ оптимизировать, очистить и упростить решение.
В качестве примера:

 public class Answers {
    int id;
    String name;
    String surname;
    String[] answer;

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public Answers() {
        answer = new String[15];
    }
}
 

основная часть:

 Answers answers = new Answers();
    //somehow set the values (maybe by using Scanner.in?)
        answers.setId(1);
        answers.setName("John");
        answers.setSurname("Baker");
        answers.answer[0] = "YES";
        answers.answer[1] = "YES";
        answers.answer[2] = "NO";
        answers.answer[3] = "NO";
        answers.answer[4] = "Elephant";
        answers.answer[5] = "Java";
        answers.answer[6] = "Maven";
        answers.answer[7] = "CSS";
        answers.answer[8] = "bash";
        answers.answer[9] = "quiz";
        answers.answer[10] = "dog";
        answers.answer[11] = "coffee";
        answers.answer[12] = "tea";
        answers.answer[13] = "YES";
        answers.answer[14] = "Borneo";
    //using Gson
        String json_file;
        Gson gson = new Gson();
        json_file = gson.toJson(answers);
    // to file
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("answers.json"));
            writer.write(json_file);
 

output .json:

 {
  "id": 1,
  "name": "John",
  "surname": "Baker",
  "answer": [
    "YES",
    "YES",
    "NO",
    "NO",
    "Elephant",
    "Java",
    "Maven",
    "CSS",
    "bash",
    "quiz",
    "dog",
    "coffee",
    "tea",
    "YES",
    "Borneo"
  ]
}
 

Вы можете добавить некоторый код для ввода ответов (я имею в виду, чтобы они были взяты с клавиатуры или что вы хотите), но я перенаправляю на Google. Будьте изобретательны!