-
-
Save ficusk/5474673 to your computer and use it in GitHub Desktop.
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)); | |
} | |
} | |
} |
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);
This is great! Thanks :)
Thank you!!
thanks ficus!
@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.
Nevermind, I figured it out https://gist.github.com/testtubebaby/8526542
@steindekker i get the same problem with you
this code is fail:
return Response.success(gson.fromJson(json, typeOfT), HttpHeaderParser.parseCacheHeaders(response));
thanks!
thanks,
I love you dear
Thanks
@ficusk Hi, We can do like this inside Response?
Type listType = new TypeToken(){}.getType(); // compiler error
@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
Hi, We can do like this inside Response?
//=================
Type listType = new TypeToken(){}.getType(); // compiler error
//=================
Source: http://stackoverflow.com/questions/5370768/using-a-generic-type-with-gson