我有以下json。我需要把它放到android的textview中,但我无法弄明白

时间:2017-08-21 17:04:47

标签: php android mysql json

这是POSTMAN中php的输出

{"questions":[{"question":"Berlin"}]}

我已经尝试使用android中的字符串请求,但没有运气。我已经在这几个小时了,似乎根本无法解决这个问题。目前使用以下代码,textview只设置为“json error”。我确定它的东西很傻但我在屏幕上寻找年龄并尝试了很多不同的方法似乎无法修复它我会永远感激一点帮助。

这是Android代码

private void getQuestion() {

    String url = "http://localhost/Articulate/getQuestion.php?category=" + category.getText().toString() + "&& game_id=" + game_id.getText().toString();
    StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            showJSON(response);
        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(com.example.conn.articulate.Play.this,error.getMessage().toString(),Toast.LENGTH_LONG).show();
                }
            });

    RequestQueue requestQueue = Volley.newRequestQueue(Play.this);
    requestQueue.add(stringRequest);
}

private void showJSON(String response){
    String questionRes="";

    try {
        JSONObject jsonObject = new JSONObject(response);
        JSONArray result = jsonObject.getJSONArray("questions");
        JSONObject q = result.getJSONObject(0);
        questionRes = q.getString("question");
    } catch (JSONException e) {
        e.printStackTrace();
        questionRes="Json error";
    }
    question.setText(questionRes);
}

堆栈

2605/com.example.conn.articulate W/System.err: org.json.JSONException: No value for question 08-21 17:28:54.500 2605-2605/com.example.conn.articulate W/System.err: at org.json.JSONObject.get(JSONObject.java:389) 08-21 17:28:54.500 
2605-2605/com.example.conn.articulate W/System.err: at org.json.JSONObject.getJSONArray(JSONObject.java:584) 08-21 17:28:54.500 2605-
2605/com.example.conn.articulate W/System.err: at com.example.conn.articulate.Play.showJSON(Play.java:124) 08-21 17:28:54.500 2605-2605/com.example.conn.articulate

PHP OUTPUT

if($_SERVER['REQUEST_METHOD']=='GET') {


//makes it work
$category = (string)filter_input(INPUT_GET, 'category');
$game_id = $_GET['game_id'];

require_once('dbConnect.php');

$query = "SELECT question FROM questions WHERE category = '$category' and NOT EXISTS
(SELECT  *
    FROM    answered_questions
    WHERE   game_id='.$game_id.'
    )ORDER BY Rand() LIMIT 1";

$result = (mysqli_query($con, $query));

$jsonData = array();
while ($array = mysqli_fetch_assoc($result)) {
    $jsonData[] = $array;
}

$data = array(
    'questions' =>
        $jsonData);
echo json_encode( $data);

//close the db connection
mysqli_close($con);

}

4 个答案:

答案 0 :(得分:0)

试试这段代码

try {
JSONObject jsonObject = new JSONObject(response);
JSONArray result = jsonObject.getJSONArray("questions");
JSONObject q = result.getJSONObject(0);
questionRes = q.getString("question");
}

您正在传递“问题”,但数组名称是“问题”,最后带有“s”。

答案 1 :(得分:0)

好的,从您的评论中可以清楚地看到为什么会发生异常。这是因为你的JSONArray问题是空洞的。因此q.getString("question")失败并出现异常,因为索引0处没有JSONObject开头。请从您的php服务器澄清是否应该发生。无论如何,即使它在这里做的是一些代码告诉用户没有找到问题。 (您可以在else块中执行其他操作,例如隐藏视图或显示新视图。

try {
        JSONObject jsonObject = new JSONObject(response);
        JSONArray result = jsonObject.getJSONArray("questions");
        if (result.length()) > 0 { 
           JSONObject q = result.getJSONObject(0);
           questionRes = q.getString("question");
        } else {
          questionRes = "No More Questions"
        }            
    } catch (JSONException e) {
        e.printStackTrace();
        questionRes="Json error";
    }

希望它有所帮助!

答案 2 :(得分:0)

要确保收到响应,您应该使用Toast或Log检查收到的响应。如果响应符合预期,请执行json解析并确保不留下任何尾随空格&#34; &#34;

答案 3 :(得分:-1)

我有一个像这样的json。使用此代码:

C11

确保在响应字符串的开头和结尾没有额外的“。