Как получить весь объект JSON со значением ключа? - PullRequest
2 голосов
/ 03 апреля 2019

Это, конечно, уже спрашивалось, но я не смог найти решение для моего случая.

У меня есть два JSON файла: quizzes.json и quizzesQuestions.json. Первый содержит только заголовки и идентификаторы всех тестов, а второй содержит все данные, необходимые для каждого теста.

quizzes.json

 [
      {
        "_id": "1",
        "title": "blabla"
      },
      {
        "_id": "2",
        "title": "blabla2"
      },
      {
        "_id": "3",
        "title": "blabla3"
      },
      {
        "_id": "4",
        "title": "blabla4"
      }
 ]

и quizzesQuestions.json:

[
    {
        "quizId": "1",
        "questions": [
            {
                "questionId": "1",
                "translations": [
                    {
                        "lang": "fr",
                        "label": "Quelle est la reponse ?",
                        "answers": [
                            "reponse 1",
                            "reponse 2",
                            "reponse 3",
                            "reponse 4"
                        ],
                        "trueAnswer": "reponse 1 2 3 or 4",
                        "explanation": "parce que..."
                    },
                    {
                        "lang": "en",
                        "label": "What is the answer ?",
                        "answers": [
                            "answer 1",
                            "answer 2",
                            "answer 3",
                            "answer 4"
                        ],
                        "trueAnswer": "answer 1 2 3 or 4",
                        "explanation": "because..."
                    },
                    {
                        "lang": "de",
                        "label": "What is the answer ?",
                        "answers": [
                            "answer 1",
                            "answer 2",
                            "answer 3",
                            "answer 4"
                        ],
                        "trueAnswer": "answer 1 2 3 or 4",
                        "explanation": "because..."
                    },
                    {
                        "lang": "sp",
                        "label": "What is the answer ?",
                        "answers": [
                            "answer 1",
                            "answer 2",
                            "answer 3",
                            "answer 4"
                        ],
                        "trueAnswer": "answer 1 2 3 or 4",
                        "explanation": "because..."
                    }
                ]
            },
            {
                "questionId": "2",
                "translations": [
                    {
                        "lang": "fr",
                        "label": "Quelle est la reponse ?",
                        "answers": [
                            "reponse 1",
                            "reponse 2",
                            "reponse 3",
                            "reponse 4"
                        ],
                        "trueAnswer": "reponse 1 2 3 or 4",
                        "explanation": "parce que..."
                    },
                    {
                        "lang": "en",
                        "label": "What is the answer ?",
                        "answers": [
                            "answer 1",
                            "answer 2",
                            "answer 3",
                            "answer 4"
                        ],
                        "trueAnswer": "answer 1 2 3 or 4",
                        "explanation": "because..."
                    },
                    {
                        "lang": "de",
                        "label": "What is the answer ?",
                        "answers": [
                            "answer 1",
                            "answer 2",
                            "answer 3",
                            "answer 4"
                        ],
                        "trueAnswer": "answer 1 2 3 or 4",
                        "explanation": "because..."
                    },
                    {
                        "lang": "sp",
                        "label": "What is the answer ?",
                        "answers": [
                            "answer 1",
                            "answer 2",
                            "answer 3",
                            "answer 4"
                        ],
                        "trueAnswer": "answer 1 2 3 or 4",
                        "explanation": "because..."
                    }
                ]
            }
        ]
    }
]

Мне нужно извлечь один объект из файла JSON (на данный момент он станет базой данных в будущем), который равен конкретному идентификатору. Здесь есть только одна викторина с идентификатором 1.

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

Вот мой Gson код, если он поможет вам понять, что я хочу сделать:

private void parseJSON() {

    String quizzesString = loadJSONFromAsset();

    try {
        JSONArray array = new JSONArray(quizzesString);
        if(array.length() > 0) {
            Gson gson = new Gson();
            int i = 0;
            while(i < array.length()) {
                quizzes.add(gson.fromJson(array.getJSONObject(i).toString(), Quizzes.class));
                i++;
            }
        } else {
            Log.d(TAG, "parseJSON: No Objects");
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

private String loadJSONFromAsset() {
    String json;
    try {
        InputStream is = getApplication().getApplicationContext().getAssets().open("quizzes.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;
}

1 Ответ

1 голос
/ 03 апреля 2019

Вы можете десериализовать JSON непосредственно из InputStream.Кроме того, вам не нужно использовать org.json для чтения JSON.Попробуйте непосредственно проанализировать данные, используя Gson:

private Map<String, Quizzes> loadQuizzes(InputStream jsonInputStream) throws IOException {
    Gson gson = new GsonBuilder().create();
    Type quizzesType = new TypeToken<List<Quizzes>>() {}.getType();

    try (InputStreamReader reader = new InputStreamReader(jsonInputStream, StandardCharsets.UTF_8)) {
        List<Quizzes> quizzes = gson.fromJson(reader, quizzesType);

        return quizzes
                .stream()
                .collect(Collectors.toMap(Quizzes::getQuizId, q -> q));
    }
}

Теперь вы можете искать Quizzes объект из Map по id.

См. Также:

...