Skip to content

Instantly share code, notes, and snippets.

@ficusk
Last active April 9, 2024 09:03
Show Gist options
  • Save ficusk/5474673 to your computer and use it in GitHub Desktop.
Save ficusk/5474673 to your computer and use it in GitHub Desktop.
A Volley adapter for JSON requests that will be parsed into Java objects by Gson.
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/**
* Volley adapter for JSON requests that will be parsed into Java objects by Gson.
*/
public class GsonRequest<T> extends Request<T> {
private final Gson gson = new Gson();
private final Class<T> clazz;
private final Map<String, String> headers;
private final Listener<T> listener;
/**
* Make a GET request and return a parsed object from JSON.
*
* @param url URL of the request to make
* @param clazz Relevant class object, for Gson's reflection
* @param headers Map of request headers
*/
public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.clazz = clazz;
this.headers = headers;
this.listener = listener;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers != null ? headers : super.getHeaders();
}
@Override
protected void deliverResponse(T response) {
listener.onResponse(response);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(
response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(
gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
}
@Laeyoung
Copy link

Thank you!!

@rmujica
Copy link

rmujica commented Dec 19, 2013

thanks ficus!

@premnirmal
Copy link

@ficusk Is there a way to handle gzip responses using volley? If I make a string request, the response appears to be scrambled and it loses its gzip encoding.

@premnirmal
Copy link

Nevermind, I figured it out https://gist.github.com/testtubebaby/8526542

@zicjin
Copy link

zicjin commented Mar 13, 2014

@steindekker i get the same problem with you
this code is fail:
return Response.success(gson.fromJson(json, typeOfT), HttpHeaderParser.parseCacheHeaders(response));

@didihe1988
Copy link

thanks!

@naveen09
Copy link

naveen09 commented Jun 1, 2014

thanks,

@fudaye
Copy link

fudaye commented Jul 17, 2014

I love you dear

@Nea-KH
Copy link

Nea-KH commented Nov 17, 2015

Thanks

@caiweihao
Copy link

@ficusk Hi, We can do like this inside Response?
Type listType = new TypeToken(){}.getType(); // compiler error

@ankitkumarsingh-aksingh
Copy link

ankitkumarsingh-aksingh commented May 30, 2017

@steindekker You can parse Json Array like this:

Type type = new TypeToken<ArrayList<Example>>(){}.getType();
ArrayList<Example> list = gson.fromJson(jsonString, type);

 ListExample listEx = new ListExample ();
 listEx.setList(list);

 // T  t = Primitives.wrap(clazz).cast(listEx);    cast your list into corresponding Class type
                
 return Response.success(Primitives.wrap(clazz).cast(listEx),
                        HttpHeaderParser.parseCacheHeaders(response));

Where T relate to 'ListExample.java' class mentioned below :

public class ListExample {

    List<Example> list;

    public List<Example> getList() {
        return list;
    }

    public void setList(List<Example> list) {
        this.list = list;
    }
}

You can send request like this:

GsonRequest<ListExample> jsonObjReq = new GsonRequest<ListExample>("Your Request Url",
                    ListExample.class, null, new Response.Listener<ListExample>() {
                @Override
                public void onResponse(ListExample response) {	 
		      List<Example> list = response.getList();
                     // Do your stuff here
                }
            },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                           // Do your stuff here
                        }
                    });

@zicjin try this, it's worked for me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment