Create a gist now

Instantly share code, notes, and snippets.

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));
}
}
}
@LOG-TAG
LOG-TAG commented Aug 19, 2013

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

return gson.fromJson(jsonString, listType);

//=================
Source: http://stackoverflow.com/questions/5370768/using-a-generic-type-with-gson

@steindekker

Is there a way to create a GsonRequest that delivers an ArrayList of an Object?

Like when you do:

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

This is great! Thanks :)

@Laeyoung

Thank you!!

@rmujica
rmujica commented Dec 19, 2013

thanks ficus!

@premnirmal

@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.

@zicjin
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

thanks!

@naveen09
naveen09 commented Jun 1, 2014

thanks,

@CaesarZhao

I love you dear

@Nea-KH
Nea-KH commented Nov 17, 2015

Thanks

@caiweihao

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

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