Convert Json object to an array - android

I need help in modifying my android studio code for converting Json object to an array. Bellow is the error in my log cat and the actual code.
This is the error message I am getting in the logcat:
04-03 12:01:16.727 19993-19993/com.errandit E/Volley: com.android.volley.ParseError: org.json.JSONException: Value {"data":[{"errand":"Shopping","charges":"500"},{"errand":"House Assistance","charges":"7000"},{"errand":"Pick - Up","charges":"2500"}],"success":1,"message":" 0 records found"} of type org.json.JSONObject cannot be converted to JSONArray
**I am trying to fetch the json array from my wamp server using the method below. **
private void getData(){
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading");
progressDialog.show();
final JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
for (int i = 0; i < response.length(); i++) {
try {
JSONObject jsonObject = response.getJSONObject(i);
Service service = new Service();
service.setName(jsonObject.getString("errand"));
service.setCharges(jsonObject.getInt("charges"));
serviceList.add(service);
} catch (JSONException e) {
e.printStackTrace();
progressDialog.dismiss();
}
}
adapter.notifyDataSetChanged();
progressDialog.dismiss();
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Log.e("Volley",error.toString());
progressDialog.dismiss();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(jsonArrayRequest);
}

Change like below as You are getting JSONObject and inside it there is JSONArray named "data".
JsonObjectRequest jsonObjRequest = new JsonObjectRequest
(Request.Method.POST, url, jsonObj, new Response.Listener<JSONObject>()
{
#Override
public void onResponse(JSONObject mResponse)
{
JSONArray response=mResponse.optJSONArray("data")
for (int i = 0; i < response.length(); i++) {
try {
JSONObject jsonObject = response.getJSONObject(i);
Service service = new Service();
service.setName(jsonObject.getString("errand"));
service.setCharges(jsonObject.getInt("charges"));
serviceList.add(service);
} catch (JSONException e) {
e.printStackTrace();
}
}
adapter.notifyDataSetChanged();
}
},
new Response.ErrorListener()
{
#Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
}
});
// Add the request to the RequestQueue.
queue.add(jsonObjRequest);

Related

Not able to fetch JSON data from api of covid19india for my android app using Volley

I want to fetch data from this file: https://api.covid19india.org/state_district_wise.json
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading data...");
progressDialog.show();
StringRequest stringRequest = new StringRequest(Request.Method.GET,
"https://api.covid19india.org/state_district_wise.json",
new Response.Listener<String>() {
#Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("Jammu and Kashmir");
progressDialog.cancel();
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
// I want get case details of "Jammu and Kashmir"
}
} catch (Exception e) {
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
//
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
What should I use here:
JSONArray jsonArray = jsonObject.getJSONArray("Jammu and Kashmir");
Data comming from API is JSONArray, not JSONObject
JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, "https://api.covid19india.org/v2/state_district_wise.json",null,
new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
try {
for (int i = 0; i < response.length(); i++) {
JSONObject dataOBJ = response.getJSONObject(i);
JSONArray jsonChild = dataOBJ.getJSONArray("districtData");
for (int k = 0; k < jsonChild.length(); k++) {
JSONObject obj = jsonChild.getJSONObject(k);
// work to be done...
}
}
} catch (Exception exp) {
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(request);
The code is working fine now. Read this for complete sollution.

Getting JSONArray result in "org.json.JSONException: Value{data}"

I am using Volley to request unsplash API but when I try requesting it as JsonObjectRequest it doesn't give me any errors but I know that is a wrong approach because the data I am receiving is JSONArray
MY APPROACH
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(
Request.Method.GET,
URL,
null,
new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
if(response!=null){
// Process the JSON
try{
// Loop through the array elements
for (int i = 0; i < response.length(); i++) {
JSONObject js = response.getJSONObject(i);
Log.d("TESTING",js.getString("id"));
}
p.dismiss();
}catch (JSONException e){
e.printStackTrace();
}
}}
},
new Response.ErrorListener(){
#Override
public void onErrorResponse(VolleyError error){
Log.d("TESTING",error.getMessage());
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(jsonArrayRequest);
LOG
Since the JSONArray is too big to post here this is the formate
D/TESTING: org.json.JSONException: Value {"total": 44760,
"total_pages": 4476,
"results":[{JSONObjects}]}
If you wish to view the JSONArray here is the link "https://api.unsplash.com/search/photos?query=wood&client_id=ACESS_KEY_REQUIRED"
also I have viewed this question but that is totally different
You can request a key simply by making an account here.
You need to create jsonObject first. You requested for JSONArray but your server response as JSONObject. Try StringRequest for getting the JSONObject.
Try this:
StringRequest stringRequest = new StringRequest(Request.Method.GET,
URL,
new Response.Listener<String>() {
#Override
public void onResponse(String response) {
try {
// Loop through the array elements
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("results");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject js = jsonArray.getJSONObject(i);
Log.d("TESTING", js.getString("id"));
}
p.dismiss();
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Log.d("TESTING",error.getMessage());
}
})
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
Hope this will work.
You are request for json object but request time you call jsonarrayrequest so JsonException is come
JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET,url,
null, new Response.Listener<JSONObject>() {
#Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("results");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject js = jsonArray.getJSONObject(i);
Log.d("TESTING",js.getString("id"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
VolleyLog.e("Error: ", error.getMessage());
}
});

Retrieve a list of json objects using volley

I need to retrieve a list of json objects from mysql database, parse it using volley and populate a listview with it. I'm new to php and volley. Here's how I'm trying.
JSON:
{"result":[{"id":"3133482000","name":"John Doe","class":"3A","parent":"admin#gmail.com","status":"0","stopid":"6","busno":"0"},{"id":"0","name":"","class":"","parent":"","status":"0","stopid":"0","busno":"0"},{"id":"334","name":"sam","class":"3a","parent":"","status":"0","stopid":"2","busno":"0"}]}
Android:
JSONArray sts;
public static final String STUDENT_URL = "http://www.smartlbus.esy.es/getAllStudents.php";
students=new ArrayList<Student>();
StringRequest stringRequest = new StringRequest(STUDENT_URL, new Response.Listener<String>() {
#Override
public void onResponse(String response) {
try {
JSONObject jsonObject=null;
jsonObject = new JSONObject(response);
sts = jsonObject.getJSONArray(JSON_ARRAY);
for (int i = 0; i < sts.length(); i++) {
JSONObject jo = sts.getJSONObject(i);
Student s=new Student();
Toast.makeText(StudentDetails.this,jo.getString(STUDENT_NAME),Toast.LENGTH_SHORT).show();
s.setId(jo.getString(STUDENT_ID));
s.setName(jo.getString(STUDENT_NAME));
s.setClassNo(jo.getString(STUDENT_CLASS));
s.setBusno(jo.getString(STUDENT_BUS));
s.setStatus(Integer.parseInt(jo.getString(STUDENT_STATUS)));
s.setStopid(jo.getString(STUDENT_STOP));
students.add(s);
}
}
catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
listView.setAdapter(new CustomListAdapter(StudentDetails.this,students));
Please help me out. In case this doesn't meet the standards here, please comment and let me know. I'll take it down.
Try to use Gson to ease your development.
Create your Java POJO Class:
public class StudentList {
List<Student> results;
// setter
public static class Student {
String name;
String id;
String status;
String class;
String stopid;
String busno;
// getter
}
}
Then parse them using GSON in the onResponse() method.
I'd suggest to use Retrofit to make network calls.
Gson gson = new Gson();
StudentList list = gson.fromJson(response);
// populate to ListView using list.getResults()
Try this & also check your URL. Your url not returning any json response.
StringRequest stringRequest = new StringRequest(Request.Method.GET,STUDENT_URL ,
new Response.Listener<String>() {
#Override
public void onResponse(String response) {
try {
Log.d("TAG","response :"+response);
JSONObject jsonObject = new JSONObject(response);
sts = jsonObject.getJSONArray(JSON_ARRAY);
for (int i = 0; i < sts.length(); i++) {
JSONObject jo = sts.getJSONObject(i);
Student s=new Student();
Log.d("TAG","Name :"+jo.getString(STUDENT_NAME));
// Toast.makeText(StudentDetails.this,jo.getString(STUDENT_NAME),Toast.LENGTH_SHORT).show();
s.setId(jo.getString(STUDENT_ID));
s.setName(jo.getString(STUDENT_NAME));
s.setClassNo(jo.getString(STUDENT_CLASS));
s.setBusno(jo.getString(STUDENT_BUS));
s.setStatus(Integer.parseInt(jo.getString(STUDENT_STATUS)));
s.setStopid(jo.getString(STUDENT_STOP));
students.add(s);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
e.printStackTrace();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);

How to retrieve a JSON without name using Volley on Android?

I have a JSON that retrieves all the users of a database. To simplify, I will show the first two users:
[
{
"id":"1",
"name":"Peter",
"age":"25"
},
{
"id":"2",
"name":"Andrew",
"age":"32"
},
...
]
As you can see, it is an array without name that contains some JSONObjects so I have tried to retrieve these data from Android with Volley library going through the whole array but without success.
Here is the code that I have by the moment:
RequestQueue queue = Volley.newRequestQueue(getContext());
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
try{
if (response != null) {
for(int i = 0; i < response.length(); i++){
JSONObject obj = response.getJSONObject(i);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Log.e("LOG", error.toString());
}
});
queue.add(jsonArrayRequest);
It always gives to me the following error:
Unhandled exception: org.json.JSONException
I also tried to retrieve the JSONArray before trying to retrieve the JSONObject but it does not allowed me because the method
JSONArray json = response.getJSONArray(0);
also gave to me the same error that I have pointed before.
I looked for a lot of examples and I cannot see where my problem is.
What am I doing wrong?
Thanks in advance!
You are not handling JSONException.
Give this a try.
StringRequest request = new StringRequest(Method.GET, url,
new Response.Listener<String>() {
#Override
public void onResponse(String response)
try {
JSONArray jsonArray = new JSONArray(response);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jo = jsonArray.getJSONObject(i);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
Cannot resolve constructor 'JsonArrayRequest(int, java.lang.String, anonymous com.android.volley.Response.Listener<org.json.JSONArray>, anonymous com.android.volley.Response.ErrorListener)'
Error doesn't lie. That request doesn't accept a Method type.
JsonArrayRequest(
String url,
Response.Listener<JSONArray> listener,
Response.ErrorListener errorListener)
StringRequest, on the other hand, does.
StringRequest(
int method,
String url,
Response.Listener<String> listener,
Response.ErrorListener errorListener)
Regarding,
Unhandled exception: org.json.JSONException
response.getJSONObject will throw that exception, so you must use a try-catch.
if (response != null) {
try {
for (int i = 0; ...) {
JSONObject jo = response.getJSONObject(i);
// use 'jo'
}
} catch (JSONException e) {
e.printStackTrace();
}
}
You should add final in final JsonArrayRequest
GOOD LUCK !!
final JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url,null, new Response.Listener() {
#Override
public void onResponse(JSONArray response) {
try{
if (response != null) {
for(int i = 0; i < response.length(); i++){
JSONObject obj = response.getJSONObject(i);
String tieude = obj.getString("tieudetin");
Toast.makeText(test.this,tieude,Toast.LENGTH_SHORT).show();
//txt.setText(tieude+"");
}
}
}catch(Exception e){
e.getMessage();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
mQueue.add(jsonArrayRequest);

Android Volley JsonRequest receiving the wrong return

After make a request the volley listener called is onErrorResponse and for my surprise the error message is the callback that I wanted from my server, a json with correct datas.
What is strange thats a parseError but how's a parse error if I make the parse in the onResponse listener.
I'm new in android.
My method:
public void getAllEstablishmentsRequest(){
String url = "http://myServer.com/something";
RequestQueue requestQueue = Volley.newRequestQueue(this);
JsonArrayRequest request = new JsonArrayRequest(url,
new Response.Listener<JSONArray>(){
#Override
public void onResponse(JSONArray response) {
try {
JSONObject object = new JSONObject(response.toString());
JSONArray Jarray = object.getJSONArray("data");
for (int i = 0; i < Jarray.length(); i++) {
JSONObject Jasonobject = Jarray.getJSONObject(i);
}
} catch (JSONException e){
Log.e("Volley", "Error JSON");
}
}
},
new Response.ErrorListener(){
#Override
public void onErrorResponse(VolleyError error){
Log.e("Volley", "Error - requisição das campanhas de Eutrofização");
System.out.println(error);
}
}
);
requestQueue.add(request);
}
Error: com.android.volley.ParseError: org.json.JSONException: Value {"data":{"establishments":[{"created_by":1,"phone":"(85) 3246-3834","teste":1453583589,"neighborhood":"Joaquim Távora","last_promotion":"2015-10-06 12:42:01","days_last_promotion":110,"id":2,"distance":0,"updated_at":"2015-10-06 12:42:01","address":"Av. Barão de Studart, 2675","name":"São Luiz","updated_by":1,"created_at":"2015-05-31 19:48:58","active":true,"longitude":"-38.510342","latitude":"-3.746922"},{"created_by":3,"phone":"(85) 4008-2444","teste":1453583589,"neighborhood":"Messejana","last_promotion":"2016-01-22 13:45:30","days_last_promotion":2,"id":96,"distance":0,"updated_at":"2016-01-22 13:45:30","address":"Av. Frei Cirilo, 4290","name":"Pinheiro","updated_by":3,"created_at":"2015-12-24 14:27:29","active":true,"longitude":"-38.495841","latitude":"-3.821112"},{"created_by":3,"phone":"","teste":1453583589,"neighborhood":"Vila Peri","last_promotion":"2016-01-21 19:06:16","days_last_promotion":2,"id":140,"distance":0,"updated_at":"2016-01-21 19:06:16","address":"Rua Cônego de Castro, 3859","name":"Cometa","updated_by":null,"created_at":"2016-01-21 18:21:41","active":true,"longitude":"-38.587981","latitude":"-3.800781"}],"establishments_total":134},"success":"YES","time":"2016-01-23 18:13:09"} of type org.json.JSONObject cannot be converted to JSONArray
You are using JsonArrayRequest when you are getting a JsonObject as a response from the server. Use JsonObjectRequest instead. Something like this:
public void getAllEstablishmentsRequest(){
String url = "http://myServer.com/something";
RequestQueue requestQueue = Volley.newRequestQueue(this);
JsonObjectRequest request = new JsonObjectRequest(url,
new Response.Listener<JSONObject>(){
#Override
public void onResponse(JSONObject object) {
try {
JSONArray Jarray = object.getJSONArray("data");
for (int i = 0; i < Jarray.length(); i++) {
JSONObject Jasonobject = Jarray.getJSONObject(i);
}
} catch (JSONException e){
Log.e("Volley", "Error JSON");
}
}
},
new Response.ErrorListener(){
#Override
public void onErrorResponse(VolleyError error){
Log.e("Volley", "Error - requisição das campanhas de Eutrofização");
System.out.println(error);
}
}
);
requestQueue.add(request);
}

Categories

Resources