当然已经问过了,但我无法为我的情况搜索解决方案。
我有两个JSON
文件:quizzes.json
和quizzesQuestions.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));
}
}
现在,您可以按id
从Map
中查找Quizzes
对象。
另请参阅:
- Java 8 – 将列表转换为映射
- 试用资源声明