如何使用键值检索整个 JSON 对象



当然已经问过了,但我无法为我的情况搜索解决方案。

我有两个JSON文件:quizzes.jsonquizzesQuestions.json。第一个只有每个测验的标题和ID,第二个测验包含每个测验所需的所有数据。

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文件中检索一个对象(现在,它将来会成为一个数据库(,它等于一个特定的id。这里只有一个 id 为 1 的测验。

我已经能够使用 Gson 从第一个文件中检索每个测验并将它们显示在列表中。现在我希望能够仅检索与用户单击的测验具有相同ID的测验,但我不知道如何进行。

这是我的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;
}
您可以

直接从InputStream反序列化JSON。此外,您无需使用 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));
    }
}

现在,您可以按idMap中查找Quizzes对象。

另请参阅:

  • Java 8 – 将列表转换为映射
  • 试用资源声明

最新更新