Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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

This comment has been minimized.

Copy link

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

This comment has been minimized.

Copy link

steindekker commented Oct 21, 2013

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 comment has been minimized.

Copy link

sambarboza commented Nov 14, 2013

This is great! Thanks :)

@Laeyoung

This comment has been minimized.

Copy link

Laeyoung commented Nov 25, 2013

Thank you!!

@rmujica

This comment has been minimized.

Copy link

rmujica commented Dec 19, 2013

thanks ficus!

@premnirmal

This comment has been minimized.

Copy link

premnirmal commented Jan 20, 2014

@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

This comment has been minimized.

Copy link

premnirmal commented Jan 20, 2014

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

@zicjin

This comment has been minimized.

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

This comment has been minimized.

Copy link

didihe1988 commented Apr 22, 2014

thanks!

@naveen09

This comment has been minimized.

Copy link

naveen09 commented Jun 1, 2014

thanks,

@fudaye

This comment has been minimized.

Copy link

fudaye commented Jul 17, 2014

I love you dear

@Nea-KH

This comment has been minimized.

Copy link

Nea-KH commented Nov 17, 2015

Thanks

@caiweihao

This comment has been minimized.

Copy link

caiweihao commented Apr 7, 2016

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

@ankitkumarsingh-aksingh

This comment has been minimized.

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
You can’t perform that action at this time.