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

标签 java android json gson json-deserialization

当然已经有人问过,但我无法为我的案例搜索解决方案。

我有两个 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 - 如何使用键值检索整个 JSON 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55499571/

相关文章:

java - 如何将 '.jar'库文件导入Unity?

android - ART 沙盒应用程序与 Dalvik 类似吗?

Android,如何以编程方式向按钮添加图标*和*文本?

json - 在 R 中使用 fromJSON 时处理 NaN

java - 执行时将源程序显示为输出?

java - 通过 Java 以 headless 模式运行 Appium

java - Mule中如何动态插入json数据到数据库中

c# - 我的 Web API C#.net 服务器无法反序列化 JSON 对象

java - 如何从 Java 小程序打开和关闭浏览器窗口?

java - 如何在 Spinner 中显示选定的项目?