получить Jsonarray в ответ на залп Android, отправив некоторые данные - PullRequest
0 голосов
/ 29 сентября 2018

Может кто-нибудь сказать мне .... как получить jsonarray в качестве ответа библиотекой залпа Android ... Я использовал метод под названием jsonArrayRequest но есть одна вещь ... Я хочу получить jsonArrayответ, отправив некоторые данные в скрипт php ..... мой скрипт php содержит три переменные ... и я передам эти три переменные из приложения Android .... затем мой скрипт php генерирует ответ jsonarray на основе этих трех значений.... Я использовал метод getParams для отправки данных в скрипт php ... но когда я запрашиваю ответ jsonArray, андроид никогда не запускает метод getParams ..... но когда я использую stringRequest ...... это будетработать правильно ...... Но я хочу, чтобы ответ jsonArray, а не stringRequest ....

Может кто-нибудь помочь мне, как это сделать ??Заранее спасибо

    package com.example.shreeram.dreamapp;

    import android.content.Intent;
    import android.graphics.Typeface;
    import android.support.annotation.NonNull;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.Spinner;
    import android.widget.TextView;

    import com.android.volley.AuthFailureError;
    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.JsonArrayRequest;
    import com.android.volley.toolbox.StringRequest;
    import com.android.volley.toolbox.Volley;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;

    public class QuestionActivity extends AppCompatActivity {


        // declare all views...
        TextView tv1,tv2,tv3,tv4,tv5;
        Spinner spinner;


        //php script url.....
        String server_url = "http://192.168.212.2/question.php";


        ArrayList<String> question;
        ArrayList<String> option1;
        ArrayList<String> option2;
        ArrayList<String> option3;
        ArrayList<String> option4;
        ArrayList<Integer> correct;
        ArrayList<Integer> q_id;
        ArrayList<Integer> id;



        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_question);


            //receive data from previous activity....data is .....value of click and listclick..
            Intent in = getIntent();
            Bundle b = in.getExtras();
          final Integer click =  b.getInt("click");
           final Integer listclick =  b.getInt("listclick");


            //initilize all views...
            tv1 = (TextView) findViewById(R.id.textView_question);
            tv2 = (TextView) findViewById(R.id.textViewop1);
            tv3 = (TextView) findViewById(R.id.textViewop2);
            tv4 = (TextView) findViewById(R.id.textViewop3);
            tv5 = (TextView) findViewById(R.id.textViewop4);
            spinner = (Spinner) findViewById(R.id.spinner);


            //Initialize all array list....here data will come from mysql database or jsonarray...
            question = new ArrayList<String>();
            option1 = new ArrayList<String>();
            option2 = new ArrayList<String>();
            option3 = new ArrayList<String>();
            option4 = new ArrayList<String>();
            correct = new ArrayList<Integer>();
            q_id = new ArrayList<Integer>();
            id = new ArrayList<Integer>();


           //Set the different fonts....
            final Typeface myfont1 = Typeface.createFromAsset(getAssets(),"fonts/Vollkorn-

    Regular.ttf");
            final Typeface myfont2 = Typeface.createFromAsset(getAssets(),"fonts/PT_Serif-

    Web-Regular.ttf");






            //This is the request from server....for jsonarray.....

            //This is starting of jsonArrayrequest.......
            JsonArrayRequest jsonArrayRequest = new JsonArrayRequest

    (Request.Method.POST, server_url,null,
                    new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {

                            //response will come here....

                            int i = 0;
                            int j = response.length();

                            //retrieve all json object from json array...and fill that data to the 

    corresponding arraylist...

                            while (i<j)
                            {
                                try {
                                    JSONObject jsonObject = response.getJSONObject(i);
                                    id.add(jsonObject.getInt("id"));
                                    q_id.add(jsonObject.getInt("q_id"));
                                    question.add(jsonObject.getString("question"));
                                    option1.add(jsonObject.getString("op_1"));
                                    option2.add(jsonObject.getString("op_2"));
                                    option3.add(jsonObject.getString("op_3"));
                                    option4.add(jsonObject.getString("op_4"));
                                    correct.add(jsonObject.getInt("correct"));


                                    i++;




                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }

                            //set fonts to all the views....

                            tv1.setTypeface(myfont1);
                            tv2.setTypeface(myfont1);
                            tv3.setTypeface(myfont1);
                            tv4.setTypeface(myfont1);
                            tv5.setTypeface(myfont1);


                            //set values to the views from arraylist....

                            tv1.setText(question.get(0));
                            tv2.setText(option1.get(0));
                            tv3.setText(option2.get(0));
                            tv4.setText(option3.get(0));
                            tv5.setText(option4.get(0));




                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {


                    //Error will appear here.....
                    tv1.setText("error happened...");

                }
            }){

                @Override
                protected Map<String, String> getParams() throws AuthFailureError {

                    Map<String , String> params = new HashMap<String, String>();

                    //put values in the params....
                    params.put("category",""+click);
                    params.put("quizno",""+listclick);

                    //return params....and values to the php script...
                    return params;
                }
            };

            //This is end of jsonArrayrequest.....


            //Create a new request queue.....
        RequestQueue requestQueue = Volley.newRequestQueue(this);


            //Add jsonarray request to the request queue....
       requestQueue.add(jsonArrayRequest);





            //End of oncreate method....
        }




        //End of activity class......
    }   


and this is the php script..... 


<?php

//get values from android app......

$click = $_POST['category'];
$listclick = $_POST['quizno'];


//This is fix....
$language = 1;







$user = "root";
$password = "";
$host = "localhost";


//All database names....

$db_name1 = "history_english";
$db_name2= "history_hindi";
$db_name3= "world_english";
$db_name4= "world_hindi";
$db_name5= "science_english";
$db_name6= "science_hindi";
$db_name7= "sports_english";
$db_name8= "sports_hindi";
$db_name9= "india_english";
$db_name10= "india_hindi";
$db_name11= "computer_english";
$db_name12= "computer_hindi";
$db_name13= "politics_english";
$db_name14= "politics_hindi";
$db_name15= "business_english";
$db_name16= "business_hindi";



//Conditions for fetch jsonarray.....

if($click==1)
{

    //means history database....

    if($language==1)
    {
        //means english database...history_english
        $con1 = mysqli_connect($host,$user,$password,$db_name1);




        //Make sql query......
        $q1 = "select * from t_".$listclick;

        $result1 = mysqli_query($con1,$q1);
        $response = array( );
        $num1 = mysqli_num_rows($result1);


        //Encode data as jsonarray.....

        while($row1 = mysqli_fetch_array($result1))
        {

            array_push($response,array("id"=>$row1["id"],"q_id"=>$row1["q_id"],"question"=>$row1["question"],"op_1"=>$row1["op_1"],
            "op_2"=>$row1["op_2"],"op_3"=>$row1["op_3"],"op_4"=>$row1["op_4"],"correct"=>$row1["correct"]));
        }


        echo json_encode($response);





    }
    else
    {
        //means hindi database.....history_hindi

        $con2 = mysqli_connect($host,$user,$password,$db_name2);


        //Write code later.....

    }










?>

1 Ответ

0 голосов
/ 30 сентября 2018

Согласно предоставленной вами информации, у вас нет проблем с использованием метода Volley StringRequest - загрузка работает правильно, а метод getParams() вызывается правильно.Знайте, что запрос сервера вернет строку!Если вы используете json_encode() в своем коде PHP, тогда эта строка будет закодирована в JSON String.Вы не предоставили код PHP ... поэтому я просто должен предположить, что все стороны PHP настроены правильно.

Вы можете использовать эту строку в кодировке JSON для создания JSONArray, просто используя JSONArray array = new JSONArray(response); где «response» - это возвращаемое значение из StringRequest.Поэтому просто создайте метод, подобный методу downLoadDataVolley(), приведенному ниже, и при необходимости передайте URL.

private void downLoadDataVolley(String url){
    RequestQueue requestQueue = Volley.newRequestQueue(this);

    StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        //INFO:: The response is of String type, but it is a JSON encoded String..
        // !! as long as the PHP code is indeed returning JSON!!
        // IF the JSON encoded string is structured as a JSONArray then do this...

        JSONArray array = new JSONArray(response);

        for(int i = 0; i < array.length(); i++){
            JSONObject o = array.getJSONObject(i);
            Iterator<String> it = o.keys();
            while(it.hasNext()){
                String key = it.next();
                String value = o.optString(key, "NA");
                Log.e("Try to Parse", "key = " + key + " value = " + value);
            }
            //String s = o.optString("key", "NA");
        }
    }
    }, new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError e) {
            e.printStackTrace();
         }
    }){
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String , String> params = new HashMap<String, String>();
        //put values in the params....
        params.put("category",""+click);
        params.put("quizno",""+listclick);

        //return params....and values to the php script...
        return params;
    }};
    requestQueue.add(stringRequest);
}

В вашем случае вы можете вызвать downLoadDataVolley(server_url), и все должно работать нормально (как это делалось ранее)за исключением этого времени вы преобразуете строку в JSONArray.

Вместо просто String s = o.optString("key", "NA"); вам нужно будет добавить свой код вместо этого, но я настоятельно рекомендую использовать optString() или optInt(), так как эти методы даютВы можете использовать дополнительные резервные значения.

Пожалуйста, дайте мне знать, если у вас есть какие-либо дополнительные вопросы.


ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

Я набираю это в стандартном текстовом редакторе ... так что у меня не было преимущества автозамены для моего кода - может быть опечатка или два.

...