Java 我能';我无法在应用程序中读取JSON

Java 我能';我无法在应用程序中读取JSON,java,android,json,Java,Android,Json,事实上,我想在Android中为医疗应用程序制作一个MCQ!所以我想从我的数据库中获取问题和可能的选择,但当我试图获取我的问题和选择时,我遇到了一个问题。JSONException显示了我的错误,我不知道为什么:( 我用jsonlint.com检查我的JSON,所以我认为这没问题。 这是我的JSON: { "QCM": { "1": { "question": "Est-ce que Captain America gagne contre Iro

事实上,我想在Android中为医疗应用程序制作一个MCQ!所以我想从我的数据库中获取问题和可能的选择,但当我试图获取我的问题和选择时,我遇到了一个问题。JSONException显示了我的错误,我不知道为什么:(

我用jsonlint.com检查我的JSON,所以我认为这没问题。 这是我的JSON:

{
    "QCM": {
        "1": {
            "question": "Est-ce que Captain America gagne contre IronMan",
            "id": "31"
        },
        "2": {
            "choix": "Oui"
        },
        "3": {
            "choix": "Non"
        }
    }
}
这是我的Android应用程序中的JAVA

try {
                        JSONObject lesQuestions = response.getJSONObject("QCM");
                        Iterator<?> keys = lesQuestions.keys();

                        while(keys.hasNext()) {
                            String key = (String) keys.next();

                            if (lesQuestions.get(key) instanceof JSONObject) {
                                JSONObject obj = (JSONObject) lesQuestions.get(key);
                                String signesCliniques = obj.getString("question");
                                String choix = obj.getString("choix");
                                lesChoixButton.setText(choix);
                                symptomesQuestions.setText(signesCliniques);

                            }
                        }
                    }
试试看{
JSONObject lesQuestions=response.getJSONObject(“QCM”);
迭代器keys=lesQuestions.keys();
while(keys.hasNext()){
字符串键=(字符串)键。下一步();
if(lesQuestions.get(key)JSONObject实例){
JSONObject obj=(JSONObject)lesQuestions.get(key);
String signesCliniques=obj.getString(“问题”);
String choix=obj.getString(“choix”);
lesChoixButton.setText(choix);
症状问题。setText(签名临床);
}
}
}

我希望你能帮助我!

不是每个JSON数据中的
JSONObject
都有“疑问”和“choix”键。我很确定你得到的是
org.JSON.JSONException:No value for…

在尝试访问之前,请确保检查是否存在“问题”或“choix”参数

编辑:


要检查,您可以使用
JSONObject.has(字符串参数)
JSONObject.isNull(字符串参数)
方法。链接:

并非JSON数据中的每个
JSONObject
都有“问题”和“选择”键。我很确定您得到的是
org.JSON.JSONException:No value for…

在尝试访问之前,请确保检查是否存在“问题”或“choix”参数

编辑:


要进行检查,可以使用
JSONObject.has(字符串参数)
JSONObject.isNull(字符串参数)
method.Link:

我建议更改JSON的结构。有一个JSONObject作为问题,有一个JSONArray作为选择。如果您仍然想继续当前的实现,则仍由您决定。您可以尝试使用的是。它将返回一个值,具体取决于键是否存在,否则它将返回一个空string.根据其说明:

如果存在按名称映射的值,则返回该值;如果不存在此类映射,则返回空字符串

像这样使用,更改您的:

String choix = obj.getString("choix");


它应该可以工作。不过你可以做得更好。

我建议你改变JSON的结构。有一个JSONObject作为问题,有一个JSONArray作为选择。如果你仍然想继续当前的实现,这仍然取决于你。你可以尝试使用的是。它将返回一个值,这取决于键是否存在,否则我会t将返回一个空字符串。根据其说明:

如果存在按名称映射的值,则返回该值;如果不存在此类映射,则返回空字符串

像这样使用,更改您的:

String choix = obj.getString("choix");


它应该可以工作。不过你可以做得更好。

正确的答案是,首先当你从服务器收到响应时,将其解析/转换为JSONObject

 JSONObject rootObject = new JSONObject (response.toString());
然后按照您正在进行的JSON解析进行操作。这是肯定的

 JSONObject lesQuestions = rootObject.getJSONObject("QCM");

正确的答案是,首先当您从服务器获得响应时,将其解析/转换为JSONObject,如

 JSONObject rootObject = new JSONObject (response.toString());
然后按照您正在进行的JSON解析进行操作。这是肯定的

 JSONObject lesQuestions = rootObject.getJSONObject("QCM");

与以“
get
”开头的方法相比,Android
JSON
解析器提供了另一个以“
opt
”开头的可选方法。
opt
的意义在于,它将返回一个
NULL
结果,而不是
抛出一个
异常

例如:

obj.getString(“问题”);
如果
JSON
没有值为“
question
”的键,则将
抛出
异常

但是,

String s=obj.optString(“问题”);
抛出
异常
,如果
JSON
没有值为“
question
”的键。您的结果字符串将是
NULL


我发现
opt
方法非常方便,而不是
get
方法,后者
抛出
异常

Android
JSON
解析器提供了另一种可选方法,与以“
get
开头的方法相比,它以“
opt
”开头“
opt
的意义在于,它将返回一个
NULL
结果,而不是
抛出一个
异常

例如:

obj.getString(“问题”);
如果
JSON
没有值为“
question
”的键,则将
抛出
异常

但是,

String s=obj.optString(“问题”);
抛出
异常
,如果
JSON
没有值为“
question
”的键。您的结果字符串将是
NULL


我觉得
opt
方法非常方便,而不是
get
方法
抛出异常
异常是什么?你能发布日志吗?你调试了吗?lesQuestions中的内容是什么?哦,对不起,只是说“org.json.JSONException:No Value For choix”。我不知道如何使用调试:/u你有一个好的教程吗^^?看起来你应该使用
response.getJSONArray(“QCM”);
而不是
response.getJSONObjec