【问题标题】:How to retrieve whole JSON object with key value?如何检索具有键值的整个 JSON 对象?
【发布时间】:2019-04-03 16:04:17
【问题描述】:

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

我有两个 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;
}

【问题讨论】:

  • 而不是将元素添加到列表中 - 为什么不考虑将它们放在地图中,您可以在其中通过键值(即测验 id)查找?

标签: java android json gson json-deserialization


【解决方案1】:

您可以直接从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 对象。

另见:

【讨论】:

  • 一旦我(有点)想通了,它就运作良好。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-08-14
  • 2019-11-03
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多