【问题标题】:Is there any way to get data from json url有没有办法从 json url 获取数据
【发布时间】:2019-04-09 17:53:41
【问题描述】:

我正在研究 android,我正在尝试从 url 解析 json 数据以从数组中获取字符串。

我尝试过使用volley,但没有得到预期的结果。

{
code: 200,
status: "OK",
data: [
{
timings: {
Fajr: "04:13 (+04)",
Sunrise: "05:36 (+04)",
Dhuhr: "12:14 (+04)",
Asr: "15:42 (+04)",
Sunset: "18:51 (+04)",
Maghrib: "18:51 (+04)",
Isha: "20:15 (+04)",
Imsak: "04:03 (+04)",
Midnight: "00:14 (+04)"
},

StringRequest stringRequest = new StringRequest(Request.Method.GET,
                URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        progressBar.setVisibility(View.GONE);

                        try {
                            //JSONObject jsonObject = new JSONObject(response);
                            JSONArray jsonArray = new JSONArray(response);

                            for(int i=0; i<jsonArray.length(); i++){

                                JSONObject o = jsonArray.getJSONObject(i);
                                ModelActivity modelActivity = new ModelActivity(
                                        o.getString("Fajr")
                                        o.getString("Dhuhr"),
                                        o.getString("Asr"),
                                        o.getString("Maghrib"),
                                        o.getString("Isha")
                                );
                                modelActivityList.add(modelActivity);
                            }

我想要fajrdhuhrasrmagrhribisha计时

任何帮助将不胜感激

【问题讨论】:

  • 使用 volley 有什么问题,你能分享你的代码吗?或日志跟踪.. 在那里您可以看到获取数据有什么问题?
  • 请分享完整的 json 响应。

标签: android json android-volley


【解决方案1】:

如果您的请求返回已发布的 JSON,那么问题不在于执行请求的 volley 库,而是您尝试解析它的方式。

在 JSON 表示中,{} 表示您有一个对象。 还有[]那个数组。

因此,您应该在第一个 json 对象中检查数据元素,然后在此数组中为每个对象查找时间,然后查找项目。

虽然我还没有编译或运行代码,但解析应该是这样的:

JSONObject jsonObject = new JSONObject(response);
JSONArray data = jsonObject.getJSONObject("data");
for(int j=0; j<data.length(); j++){
    JSONObject jObj = data.getJSONObject(j);
    JSONArray jsonArrayTimings = new JSONArray(jObj.getJSONObject("timings"));

    for(int i=0; i<jsonArray.length(); i++){

        JSONObject o = jsonArray.getJSONObject(i);
        ModelActivity modelActivity = new ModelActivity(
                o.getString("Fajr")
                o.getString("Dhuhr"),
                o.getString("Asr"),
                o.getString("Maghrib"),
                o.getString("Isha")
        );
        modelActivityList.add(modelActivity);
    }
}

有关 json 解析的更多详细信息,您应该查看link

【讨论】:

  • JSONArray jsonArrayTimings = new JSONArray(jObj.getJSONObject("timings"));此行给出错误调用需要 API 级别 19(当前最小值为 15):新 org.json.JSONArray
  • 我想旧版本会有一些等价物......我个人总是使用gson library,因为我的 json 对象是预定义的,并且解析的编码更少。
【解决方案2】:

您应该使用 JsonObjectRequest 而不是 StringRequest。这是一个例子:

    public void getRate(String tripDate) {

    Rate = 0.54;

    String url = "https://myserver/api/rates/" + tripDate;

    JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.GET,url,null,
    new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

            try {

                // since response is a JSONObject use getJSONArray to
                // get the JSONArray out of the JSONObject
                JSONArray rates = response.getJSONArray("rates");

            } catch (Exception e) {
                e.printStackTrace();
                Rate = 0.54;

                Log.i("Test", "Default Rate:" + Rate);

            }

        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("Test", "Response Error: " + error.getLocalizedMessage());
            Rate = 0.54;

            Log.i("Test", "Default Rate:" + Rate);


        }
    }) {


   @Override
   public Map<String, String> getHeaders() throws AuthFailureError {
       HashMap<String, String> headers = new HashMap<String, String>();
        String authValue = "Bearer ";
        headers.put("Authorization", authValue);
        headers.put("Accept", "application/json; charset=utf-8");
        headers.put("Content-Type", "application/json; charset=utf-8");
       return headers;
   }


};


MyApplication.getInstance().addToRequestQueue(postRequest);

}

如果您的 API 返回 JSONArray,那么您可以改用 JSONArrayRequest...

JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(
                    Request.Method.GET,
                    mJSONURLString,
                    null,
                    new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多