Есть ли какой-либо способ получить данные из URL-адреса json

#android #json #android-volley

#Android #json #android-volley

Вопрос:

Я работаю на Android и пытаюсь проанализировать данные json из URL, чтобы получить строку из массива.

Я пытался использовать 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);
                            }
  

Мне нужны fajr dhuhr asr magrhrib isha тайминги

любая помощь будет оценена

Комментарии:

1. в чем проблема с использованием volley, можете ли вы поделиться своим кодом? или трассировка журнала.. именно здесь вы можете увидеть, что не так с выборкой данных?

2. Пожалуйста, поделитесь полным ответом json.

Ответ №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 вам следует перейти по этой ссылке

Комментарии:

1. JSONArray jsonArrayTimings = new JSONArray(jObj.getJSONObject(«тайминги»)); для вызова этой строки с ошибкой требуется уровень API 19 (текущий минимум равен 15): new org.json.JSONArray

2. Я предполагаю, что для более старых версий будет какой-то эквивалент… лично я всегда использую 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) {