从 Android 获取带有 StringRequest 的 JSONArray

Posted

技术标签:

【中文标题】从 Android 获取带有 StringRequest 的 JSONArray【英文标题】:Get JSONArray with StringRequest from Android 【发布时间】:2018-08-06 09:20:31 【问题描述】:

我正在尝试通过在 android 中使用 StringRequest 以及 POST 方法来获取 JSONArray。

php-script 是这样写的:

$statement = mysqli_prepare($con, "SELECT * FROM tickets WHERE user_id > 5 AND completed = 1");
    mysqli_stmt_bind_param($statement, "i", $UID);
    mysqli_stmt_execute($statement);

    mysqli_stmt_store_result($statement);
    mysqli_stmt_bind_result($statement, $user_id, $beacon_id, $timeFrom, $timeTo, $completed);



    $jsonObject = array();
    $response = array();

    while($status = mysqli_stmt_fetch($statement))
            $jsonObject = null;

            $jsonObject["beacon_id"]= $beacon_id;
            $jsonObject["timeFrom"]= $timeFrom;
            $jsonObject["timeTo"]= $timeTo;

            $response[] = $jsonObject;
    

echo json_encode($response);?>

使用 php-script 访问网页,“回显”以下 JSONArray:

["beacon_id":10,"timeFrom":"2018-02-14 13:07:11","timeTo":"2018-02-14 14:32:53","beacon_id":3,"timeFrom":"2018-02-24 13:33:37","timeTo":"2018-02-24 13:33:47"]

据我了解,这是一个普通的 JSONArray,方括号表示数组,大括号表示数组中的每个 JSONObject。

当我尝试通过 Android Studio (Java) 中的 StringRequest 访问此 JSONArray 时,我没有得到任何结果...

StringRequest 代码:

public class HistoryRequest extends StringRequest 
    private static final String HISTORY_REQUEST_URL = "http://myURL.../myPHPfile.php";
    private Map<String, String> params;

    public HistoryRequest(String user_id, String instanceID, Response.Listener<String> listener) 
        super(Method.POST, HISTORY_REQUEST_URL, listener, null);
        params = new HashMap<>();
        params.put("user_id", user_id);
        params.put("instanceID", instanceID);


    @Override
    public Map<String, String> getParams() return params;

MainActivity 中的 ResponseListener 是这样写的:

Response.Listener<String> responseListener = new Response.Listener<String>() 
@Override
public void onResponse(String response) 
    JSONArray jsonArray = new JSONArray(response);
    for(int i = 0; i < jsonArray.length(); i++) 
        JSONObject jsonObject = jsonArray.getJSONObject(i);

        String timeFrom = jsonObject.getString("timeFrom");
        String timeTo = jsonObject.getString("timeTo");

        textviewFrom.append(timeFrom);
        textviewTo.append(timeTo);
        
    
;

任何提示为什么我不能制作网页 URL 中看起来像漂亮 JSONArray 的字符串的 JSONArray?

提前致谢!

更新:

在切换到 JSONArrayRequest 而不是 StringRequest 后,如果我将 php-script 的 MySQL 部分更改为静态的东西,我可以获得数据:

SELECT * FROM tickets;

然后我可以显示所有条目。但我倾向于向服务器发送 1 个参数(user_id),这样我就可以根据登录的用户过滤条目。[SELECT * FROM ticket where user_id = ?],就像传统的 POST 方法...... .

有人知道该怎么做吗?阅读几个你不能@Override getParams() 方法的地方...

已解决:

我通过在 URL 中输入键值 (user_id) 解决了这个问题。

//Instead of POST:
$user_id = $_POST["user_id"];

// I use SERVER to get the value after ? in the URL:
$user_id = $_SERVER['QUERY_STRING'];

使用以下 java 代码执行此操作:

public class HistoryRequest extends JsonArrayRequest 
private static final String HISTORY_REQUEST_URL = "http://myURLorIPaddress/getHistory.php?";

    public HistoryRequest(String UID, Response.Listener<JSONArray> listener) throws JSONException 
        super(Method.POST, HISTORY_REQUEST_URL + UID,null, listener, null);


这使得根据 user_id 过滤结果成为可能,就像一个魅力:D

【问题讨论】:

你能尝试打印你得到的字符串响应并验证吗? 请看下面的答案:) 不要提供附加材料作为问题的答案。使用Edit 按钮编辑您的问题并添加其他信息。您的请求似乎引发了错误,甚至没有命中 API。弄清楚请求有什么问题后,您可以查看响应。 【参考方案1】:

我没有打印任何内容,但我可以看到 Volley 库正在抱怨一些外部错误(没有涉及我的代码)。 log.i("OnResponseLog", response) 没有提供任何东西。

Picture of error from LogCat:

【讨论】:

【参考方案2】:

我正在从事类似的项目,您是否检查过是否有一些空条目?我认为通过检查您的 LogCat 图片可能会出现问题。

使用 isNull() 函数检查可能是个好主意。 https://processing.org/reference/JSONObject_isNull_.html

【讨论】:

以上是关于从 Android 获取带有 StringRequest 的 JSONArray的主要内容,如果未能解决你的问题,请参考以下文章

Android imageview从缩放图像中获取像素颜色

Xamarin Android,使用带有选择和选择参数的 CursorLoader 获取联系人手机号码

Android,从edittext中获取文本[重复]

android使用片段从相机或画廊获取照片[重复]

Android - 如何使用 PHP 从 MySQL 数据库中获取响应?

使用 Cordova 和 JavaScript(没有 getUserMedia)从 android 麦克风获取音频数据