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. Будьте изобретательны!