httcppheaderparserr什么东西

求助:使用volley的JsonArrayRequest的时候报错
&org.json.JSONException:&Value&?>>?&of&type&java.lang.String&cannot&be&converted&to&JSONArray
&com.android.volley.ParseError:&org.json.JSONException:&Value&?>>?&of&type&java.lang.String&cannot&be&converted&to&JSONArray
& at&com.android.volley.toolbox.JsonArrayRequest.parseNetworkResponse(JsonArrayRequest.java:55)
& at&com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:116)
&Cause&java.lang.String&cannot&be&converted&to&JSONArray
& at&org.json.JSON.typeMismatch(JSON.java:111)
& at&org.json.JSONArray.&init&(JSONArray.java:91)
& at&org.json.JSONArray.&init&(JSONArray.java:103)
& at&com.android.volley.toolbox.JsonArrayRequest.parseNetworkResponse(JsonArrayRequest.java:50)
& ...&1&more
不知道是什么原因,难道是服务器的json数据不对吗
我如果使用URLConnection去请求数据解析的时候,就没问题,能正常解析到?有没有谁碰到过类似的问题呢?
难道我要放弃使用volley了。。。
贴代码&你请求的代码呢
引用&1&楼&qq_&的回复:贴代码&你请求的代码呢
代码应该没问题吧:
JsonArrayRequest&jsonArrayRequest&=&new&JsonArrayRequest(url,&new&Listener&JSONArray&()&{
public&void&onResponse(JSONArray&response)&{
//&TODO&Auto-generated&method&stub
Log.d(TAG,&response.toString());
for(int&i=0;i&response.length();i++){
JSONObject&jsonObject&=&response.getJSONObject(i);
Log.i(TAG,&jsonObject.getString("PN")&+&":"+jsonObject.getString("CD")+&":"+jsonObject.getString("URL"));
}&catch&(JSONException&e)&{
//&TODO&Auto-generated&catch&block
e.printStackTrace();
},&new&ErrorListener()&{
public&void&onErrorResponse(VolleyError&error)&{
//&TODO&Auto-generated&method&stub
Log.e(TAG,&error.getMessage(),error);
你在logcat中打印的response.toString()的数据对吗
引用&3&楼&jhjhy123&的回复:你在logcat中打印的response.toString()的数据对吗
都没执行到这里呢,直接异常onErrorResponse在这里面打印了
乱码了,你得设置下请求的编码
大兄弟。。你可知道volley用post带参请求时为什么参数会丢失么?
还有,你这个可能是编码问题,看到乱码了
嘿嘿,错了别怪,我猜的,我也不太懂
把分都给我吧。。。
import&java.io.UnsupportedEncodingE
import&org.json.JSONE
import&org.json.JSONO
import&com.android.volley.NetworkR
import&com.android.volley.ParseE
import&com.android.volley.R
import&com.android.volley.Response.ErrorL
import&com.android.volley.Response.L
import&com.android.volley.toolbox.HttpHeaderP
import&com.android.volley.toolbox.JsonObjectR
public&class&JsonObjectUTF8Request&extends&JsonObjectRequest{
&public&JsonObjectUTF8Request(String&url,&JSONObject&jsonRequest,
Listener&JSONObject&&listener,&ErrorListener&errorListener)&{
super(url,&jsonRequest,&listener,&errorListener);
//&TODO&Auto-generated&constructor&stub
&&&&protected&Response&JSONObject&&parseNetworkResponse(NetworkResponse&response)&{
&&&&&&&&try&{
&&&&&&&&&&&&//&solution&1:
&&&&&&&&&&&&String&jsonString&=&new&String(response.data,&"gbk");
&&&&&&&&&&&&return&Response.success(new&JSONObject(jsonString),
&&&&&&&&&&&&&&&&&&&&HttpHeaderParser.parseCacheHeaders(response));
&&&&&&&&}&catch&(UnsupportedEncodingException&e)&{
&&&&&&&&&&&&return&Response.error(new&ParseError(e));
&&&&&&&&}&catch&(JSONException&je)&{
&&&&&&&&&&&&return&Response.error(new&ParseError(je));
private&void&requestJson()&{
RequestQueue&mQueue&=&Volley.newRequestQueue(getActivity());&&
JsonObjectUTF8Request&jReq&=&new&JsonObjectUTF8Request("http://1./data.json",null,
&&&&&&&&&&&&&&&&new&Response.Listener&JSONObject&()&{
public&void&onResponse(JSONObject&response)&{
JSONArray&jy&=&
new&String();
jy&=&response.getJSONArray("data");
}&catch&(JSONException&e1)&{
//&TODO&Auto-generated&catch&block
e1.printStackTrace();
//等于零没有数据在处理&&&mPullRefreshListView.onRefreshComplete();//刷新完成
for&(int&i&=&0;&i&&&jy.length();&i++)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&& Log.d("sdfsdgfsdgfsd",&response.toString());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&result.add(convertWebPage(jy.getJSONObject(i)));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&catch&(JSONException&e)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&volleyListAdapter.setItemList(result);
&&&&&&&&&&&&&&&&&&&&&&&&volleyListAdapter.notifyDataSetChanged();
&&&&&&&&&&&&&&&&&&&&&&&&mPullRefreshListView.onRefreshComplete();//刷新完成
&&&&&&&&&&&&&&&&},&new&Response.ErrorListener()&{
&&&&&&&&&&&&&&&&&&&&@Override
&&&&&&&&&&&&&&&&&&&&public&void&onErrorResponse(VolleyError&error)&{
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&});
//request.setRetryPolicy(new&DefaultRetryPolicy(20&*&.0f));
jReq.setRetryPolicy(new&DefaultRetryPolicy(20&*&.0f));
mQueue.add(jReq);
mQueue.start();
private&WebPage&convertWebPage(JSONObject&jsonObject)&throws&JSONException&{
&&&String&title&=&jsonObject.getString("title");
&&&&&&&String&description&=&jsonObject.getString("description");
&&&&&&&String&url&=&jsonObject.getString("url");
&&&&&&&return&new&WebPage(title,&description,&url);
我也碰到了JSONArrayRequest请求出错的问题,求解
JsonArrayRequest&arrayRequest&=&new&JsonArrayRequest(
HttpConstant.HQ_HOST&+&codes,&new&Listener&JSONArray&()&{
public&void&onResponse(JSONArray&arg0)&{
//&TODO&Auto-generated&method&stub
for&(int&i&=&0;&i&&&arg0.length();&i++)&{
HQData&data&=&new&HQData(arg0.optJSONObject(i),
hqentity.get(i).getBaoliu(),&hqentity
.get(i).getName());
listItemData.add(data);
handler.sendEmptyMessage(100);
},&new&ErrorListener()&{
public&void&onErrorResponse(VolleyError&arg0)&{
//&TODO&Auto-generated&method&stub
queue.add(arrayRequest);
感觉楼主应该要用的是&StringRequest。
服务器返回的是String类型,jsonArrayRequest的回调里传的是JsonArray类型,所以报错,让服务器返回JsonArray类型就对了
楼上正解。。。。。。。
你这个应该是服务端数据问题吧,你使用JsonArray返回的应该是一个Array类型的数据,你是不是返回的数据是string的,所以会出现解析错误
我也遇到了这个问题,使用StringRequest返回xml数据,楼主是怎么解决的
即使是一小步也想与你分享使HttpClient能处理错误ResponseHeader的响应信息。 - 快乐、修身、齐家 - ITeye技术网站
博客分类:
在特定条件下,也许需要来定制HTTP报文通过线路传递,越过了可能使用的HTTP参数来处理非标准不兼容行为的方式。比如,对于Web爬虫,它可能需要强制HttpClient接受格式错误的响应头部信息,来抢救报文的内容。
自己参考网上写了个类。
package sh.
import java.io.IOE
import org.apache.http.H
import org.apache.http.HttpE
import org.apache.http.HttpR
import org.apache.http.HttpResponseF
import org.apache.http.HttpV
import org.apache.http.conn.ClientConnectionO
import org.apache.http.conn.OperatedClientC
import org.apache.http.conn.scheme.SchemeR
import org.apache.http.impl.conn.BasicClientConnectionM
import org.apache.http.impl.conn.DefaultClientC
import org.apache.http.impl.conn.DefaultClientConnectionO
import org.apache.http.impl.conn.DefaultHttpResponseP
import org.apache.http.io.HttpMessageP
import org.apache.http.io.SessionInputB
import org.apache.http.message.BasicH
import org.apache.http.message.BasicHttpR
import org.apache.http.message.BasicLineP
import org.apache.http.message.BasicStatusL
import org.apache.http.message.LineP
import org.apache.http.params.HttpP
import org.apache.http.util.CharArrayB
public class MyBasicClientConnectionManager extends
BasicClientConnectionManager {
public MyBasicClientConnectionManager() {
protected ClientConnectionOperator createConnectionOperator(
final SchemeRegistry sr) {
return new MyClientConnectionOperator(sr);
class MyLineParser extends BasicLineParser {
public Header parseHeader(final CharArrayBuffer buffer) {
return super.parseHeader(buffer);
} catch (Exception ex) {
// 压制ParseException异常
return new BasicHeader("invalid", buffer.toString());
class MyClientConnection extends DefaultClientConnection {
protected HttpMessageParser createResponseParser(
final SessionInputBuffer buffer,
final HttpResponseFactory responseFactory,
final HttpParams params) {
return new MyDefaultHttpResponseParser(buffer, new MyLineParser(),
responseFactory, params);
class MyDefaultHttpResponseParser extends DefaultHttpResponseParser {
public MyDefaultHttpResponseParser(SessionInputBuffer buffer,
LineParser parser, HttpResponseFactory responseFactory,
HttpParams params) {
super(buffer, parser, responseFactory, params);
protected HttpResponse parseHead(final SessionInputBuffer sessionBuffer)
throws IOException, HttpException {
return super.parseHead(sessionBuffer);
} catch (Exception ex) {
// 压制ParseException异常
return new BasicHttpResponse(new BasicStatusLine(
HttpVersion.HTTP_1_1, 200, ""));
class MyClientConnectionOperator extends DefaultClientConnectionOperator {
public MyClientConnectionOperator(final SchemeRegistry sr) {
super(sr);
public OperatedClientConnection createConnection() {
return new MyClientConnection();
ClientConnectionManager cm = new MyBasicClientConnectionManager();
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response = hc.execute(http);
下载次数: 72
浏览: 99702 次
来自: 上海
我去,你那个simpleDateFormat哪里来的,根本么用 ...
andyzhchy 写道新建一个类继承SimpleOnGest ...
我很想知道JDBCToXML是从哪里来的?是自己写的一个类吗? ...73112人阅读
Android疑难解析(35)
转载请注明出处:经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest、JsonRequest、ImageRequest等。其中StringRequest用于请求一条普通的文本数据,JsonRequest(JsonObjectRequest、JsonArrayRequest)用于请求一条JSON格式的数据,ImageRequest则是用于请求网络上的一张图片。可是Volley提供给我们的Request类型就只有这么多,而我们都知道,在网络上传输的数据通常有两种格式,JSON和XML,那么如果想要请求一条XML格式的数据该怎么办呢?其实很简单,Volley提供了非常强的扩展机制,使得我们可以很轻松地定制出任意类型的Request,这也就是本篇文章的主题了。在开始之前还是友情提醒一下,如果你还没有阅读过我前面两篇关于Volley的文章,建议先去阅读一下和。1. 自定义XMLRequest下面我们准备自定义一个XMLRequest,用于请求一条XML格式的数据。那么该从哪里开始入手呢?额,好像是有些无从下手。遇到这种情况,我们应该去参考一下Volley的源码,看一看StringRequest是怎么实现的,然后就可以模仿着写出XMLRequest了。首先看下StringRequest的源码,如下所示:/**
* A canned request for retrieving the response body at a given URL as a String.
public class StringRequest extends Request&String& {
private final Listener&String& mL
* Creates a new request with the given method.
* @param method the request {@link Method} to use
* @param url URL to fetch the string at
* @param listener Listener to receive the String response
* @param errorListener Error listener, or null to ignore errors
public StringRequest(int method, String url, Listener&String& listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mListener =
* Creates a new GET request.
* @param url URL to fetch the string at
* @param listener Listener to receive the String response
* @param errorListener Error listener, or null to ignore errors
public StringRequest(String url, Listener&String& listener, ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
protected void deliverResponse(String response) {
mListener.onResponse(response);
protected Response&String& parseNetworkResponse(NetworkResponse response) {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}可以看到,StringRequest的源码很简练,根本就没几行代码,我们一起来分析下。首先StringRequest是继承自Request类的,Request可以指定一个泛型类,这里指定的当然就是String了,接下来StringRequest中提供了两个有参的构造函数,参数包括请求类型,请求地址,以及响应回调等,由于我们已经很熟悉StringRequest的用法了,相信这几个参数的作用都不用再解释了吧。但需要注意的是,在构造函数中一定要调用super()方法将这几个参数传给父类,因为HTTP的请求和响应都是在父类中自动处理的。另外,由于Request类中的deliverResponse()和parseNetworkResponse()是两个抽象方法,因此StringRequest中需要对这两个方法进行实现。deliverResponse()方法中的实现很简单,仅仅是调用了mListener中的onResponse()方法,并将response内容传入即可,这样就可以将服务器响应的数据进行回调了。parseNetworkResponse()方法中则应该对服务器响应的数据进行解析,其中数据是以字节的形式存放在NetworkResponse的data变量中的,这里将数据取出然后组装成一个String,并传入Response的success()方法中即可。了解了StringRequest的实现原理,下面我们就可以动手来尝试实现一下XMLRequest了,代码如下所示:public class XMLRequest extends Request&XmlPullParser& {
private final Listener&XmlPullParser& mL
public XMLRequest(int method, String url, Listener&XmlPullParser& listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mListener =
public XMLRequest(String url, Listener&XmlPullParser& listener, ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
protected Response&XmlPullParser& parseNetworkResponse(NetworkResponse response) {
String xmlString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (XmlPullParserException e) {
return Response.error(new ParseError(e));
protected void deliverResponse(XmlPullParser response) {
mListener.onResponse(response);
}可以看到,其实并没有什么太多的逻辑,基本都是仿照StringRequest写下来的,XMLRequest也是继承自Request类的,只不过这里指定的泛型类是XmlPullParser,说明我们准备使用Pull解析的方式来解析XML。在parseNetworkResponse()方法中,先是将服务器响应的数据解析成一个字符串,然后设置到XmlPullParser对象中,在deliverResponse()方法中则是将XmlPullParser对象进行回调。好了,就是这么简单,下面我们尝试使用这个XMLRequest来请求一段XML格式的数据。这个接口会将中国所有的省份数据以XML格式进行返回,如下所示:&china dn=&day& slick-uniqueid=&3&&
&city quName=&黑龙江& pyName=&heilongjiang& cityname=&哈尔滨& state1=&0& state2=&0& stateDetailed=&晴& tem1=&18& tem2=&6& windState=&西北风3-4级转西风小于3级&/&
&city quName=&吉林& pyName=&jilin& cityname=&长春& state1=&0& state2=&0& stateDetailed=&晴& tem1=&19& tem2=&6& windState=&西北风3-4级转小于3级&/&
&city quName=&辽宁& pyName=&liaoning& cityname=&沈阳& state1=&0& state2=&0& stateDetailed=&晴& tem1=&21& tem2=&7& windState=&东北风3-4级&/&
&city quName=&海南& pyName=&hainan& cityname=&海口& state1=&1& state2=&1& stateDetailed=&多云& tem1=&30& tem2=&24& windState=&微风&/&
&city quName=&内蒙古& pyName=&neimenggu& cityname=&呼和浩特& state1=&0& state2=&0& stateDetailed=&晴& tem1=&19& tem2=&5& windState=&东风3-4级&/&
&city quName=&新疆& pyName=&xinjiang& cityname=&乌鲁木齐& state1=&0& state2=&0& stateDetailed=&晴& tem1=&22& tem2=&10& windState=&微风转东南风小于3级&/&
&city quName=&西藏& pyName=&xizang& cityname=&拉萨& state1=&1& state2=&7& stateDetailed=&多云转小雨& tem1=&18& tem2=&4& windState=&微风&/&
&city quName=&青海& pyName=&qinghai& cityname=&西宁& state1=&0& state2=&1& stateDetailed=&晴转多云& tem1=&18& tem2=&2& windState=&微风&/&
&city quName=&宁夏& pyName=&ningxia& cityname=&银川& state1=&0& state2=&0& stateDetailed=&晴& tem1=&19& tem2=&8& windState=&微风&/&
&city quName=&甘肃& pyName=&gansu& cityname=&兰州& state1=&0& state2=&0& stateDetailed=&晴& tem1=&21& tem2=&6& windState=&微风&/&
&city quName=&河北& pyName=&hebei& cityname=&石家庄& state1=&0& state2=&0& stateDetailed=&晴& tem1=&25& tem2=&12& windState=&北风小于3级&/&
&city quName=&河南& pyName=&henan& cityname=&郑州& state1=&0& state2=&0& stateDetailed=&晴& tem1=&24& tem2=&13& windState=&微风&/&
&city quName=&湖北& pyName=&hubei& cityname=&武汉& state1=&0& state2=&0& stateDetailed=&晴& tem1=&24& tem2=&12& windState=&微风&/&
&city quName=&湖南& pyName=&hunan& cityname=&长沙& state1=&2& state2=&1& stateDetailed=&阴转多云& tem1=&20& tem2=&15& windState=&北风小于3级&/&
&city quName=&山东& pyName=&shandong& cityname=&济南& state1=&1& state2=&1& stateDetailed=&多云& tem1=&20& tem2=&10& windState=&北风3-4级转小于3级&/&
&city quName=&江苏& pyName=&jiangsu& cityname=&南京& state1=&2& state2=&2& stateDetailed=&阴& tem1=&19& tem2=&13& windState=&西北风4-5级转3-4级&/&
&city quName=&安徽& pyName=&anhui& cityname=&合肥& state1=&2& state2=&1& stateDetailed=&阴转多云& tem1=&20& tem2=&12& windState=&西北风转北风3-4级&/&
&city quName=&山西& pyName=&shanxi& cityname=&太原& state1=&0& state2=&0& stateDetailed=&晴& tem1=&22& tem2=&8& windState=&微风&/&
&city quName=&陕西& pyName=&sanxi& cityname=&西安& state1=&1& state2=&0& stateDetailed=&多云转晴& tem1=&21& tem2=&9& windState=&东北风小于3级&/&
&city quName=&四川& pyName=&sichuan& cityname=&成都& state1=&1& state2=&1& stateDetailed=&多云& tem1=&26& tem2=&15& windState=&南风小于3级&/&
&city quName=&云南& pyName=&yunnan& cityname=&昆明& state1=&7& state2=&7& stateDetailed=&小雨& tem1=&21& tem2=&13& windState=&微风&/&
&city quName=&贵州& pyName=&guizhou& cityname=&贵阳& state1=&1& state2=&3& stateDetailed=&多云转阵雨& tem1=&21& tem2=&11& windState=&东风小于3级&/&
&city quName=&浙江& pyName=&zhejiang& cityname=&杭州& state1=&3& state2=&1& stateDetailed=&阵雨转多云& tem1=&22& tem2=&14& windState=&微风&/&
&city quName=&福建& pyName=&fujian& cityname=&福州& state1=&1& state2=&2& stateDetailed=&多云转阴& tem1=&28& tem2=&18& windState=&微风&/&
&city quName=&江西& pyName=&jiangxi& cityname=&南昌& state1=&2& state2=&1& stateDetailed=&阴转多云& tem1=&23& tem2=&15& windState=&北风3-4级转微风&/&
&city quName=&广东& pyName=&guangdong& cityname=&广州& state1=&3& state2=&2& stateDetailed=&阵雨转阴& tem1=&26& tem2=&20& windState=&微风&/&
&city quName=&广西& pyName=&guangxi& cityname=&南宁& state1=&3& state2=&3& stateDetailed=&阵雨& tem1=&23& tem2=&19& windState=&东北风小于3级&/&
&city quName=&北京& pyName=&beijing& cityname=&北京& state1=&0& state2=&0& stateDetailed=&晴& tem1=&26& tem2=&10& windState=&微风&/&
&city quName=&天津& pyName=&tianjin& cityname=&天津& state1=&1& state2=&0& stateDetailed=&多云转晴& tem1=&22& tem2=&13& windState=&东北风3-4级转小于3级&/&
&city quName=&上海& pyName=&shanghai& cityname=&上海& state1=&7& state2=&1& stateDetailed=&小雨转多云& tem1=&20& tem2=&16& windState=&西北风3-4级&/&
&city quName=&重庆& pyName=&chongqing& cityname=&重庆& state1=&1& state2=&3& stateDetailed=&多云转阵雨& tem1=&21& tem2=&14& windState=&微风&/&
&city quName=&香港& pyName=&xianggang& cityname=&香港& state1=&3& state2=&1& stateDetailed=&阵雨转多云& tem1=&26& tem2=&22& windState=&微风&/&
&city quName=&澳门& pyName=&aomen& cityname=&澳门& state1=&3& state2=&1& stateDetailed=&阵雨转多云& tem1=&27& tem2=&22& windState=&东北风3-4级转微风&/&
&city quName=&台湾& pyName=&taiwan& cityname=&台北& state1=&9& state2=&7& stateDetailed=&大雨转小雨& tem1=&28& tem2=&21& windState=&微风&/&
&city quName=&西沙& pyName=&xisha& cityname=&西沙& state1=&3& state2=&3& stateDetailed=&阵雨& tem1=&30& tem2=&26& windState=&东北风4-5级&/&
&city quName=&南沙& pyName=&nanshadao& cityname=&南沙& state1=&1& state2=&1& stateDetailed=&多云& tem1=&32& tem2=&27& windState=&东风4-5级&/&
&city quName=&钓鱼岛& pyName=&diaoyudao& cityname=&钓鱼岛& state1=&7& state2=&1& stateDetailed=&小雨转多云& tem1=&23& tem2=&19& windState=&西南风3-4级转北风5-6级&/&
&/china&确定了访问接口后,我们只需要在代码中按照以下的方式来使用XMLRequest即可:XMLRequest xmlRequest = new XMLRequest(
&.cn/wmaps/xml/china.xml&,
new Response.Listener&XmlPullParser&() {
public void onResponse(XmlPullParser response) {
int eventType = response.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String nodeName = response.getName();
if (&city&.equals(nodeName)) {
String pName = response.getAttributeValue(0);
Log.d(&TAG&, &pName is & + pName);
eventType = response.next();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}, new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
Log.e(&TAG&, error.getMessage(), error);
mQueue.add(xmlRequest);可以看到,这里XMLRequest的用法和StringRequest几乎是一模一样的,我们先创建出一个XMLRequest的实例,并把服务器接口地址传入,然后在onResponse()方法中解析响应的XML数据,并把每个省的名字打印出来,最后将这个XMLRequest添加到RequestQueue当中。现在运行一下代码,观察控制台日志,就可以看到每个省的名字都从XML中解析出来了,如下图所示。2. 自定义GsonRequestJsonRequest的数据解析是利用Android本身自带的JSONObject和JSONArray来实现的,配合使用JSONObject和JSONArray就可以解析出任意格式的JSON数据。不过也许你会觉得使用JSONObject还是太麻烦了,还有很多方法可以让JSON数据解析变得更加简单,比如说GSON。遗憾的是,Volley中默认并不支持使用自家的GSON来解析数据,不过没有关系,通过上面的学习,相信你已经知道了自定义一个Request是多么的简单,那么下面我们就来举一反三一下,自定义一个GsonRequest。首先我们需要把gson的jar包添加到项目当中,jar包的下载地址是:&。接着定义一个GsonRequest继承自Request,代码如下所示:public class GsonRequest&T& extends Request&T& {
private final Listener&T& mL
private Gson mG
private Class&T& mC
public GsonRequest(int method, String url, Class&T& clazz, Listener&T& listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
mListener =
public GsonRequest(String url, Class&T& clazz, Listener&T& listener,
ErrorListener errorListener) {
this(Method.GET, url, clazz, listener, errorListener);
protected Response&T& parseNetworkResponse(NetworkResponse response) {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(jsonString, mClass),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
protected void deliverResponse(T response) {
mListener.onResponse(response);
}可以看到,GsonRequest是继承自Request类的,并且同样提供了两个构造函数。在parseNetworkResponse()方法中,先是将服务器响应的数据解析出来,然后通过调用Gson的fromJson方法将数据组装成对象。在deliverResponse方法中仍然是将最终的数据进行回调。那么下面我们就来测试一下这个GsonRequest能不能够正常工作吧,调用这个接口可以得到一段JSON格式的天气数据,如下所示:{&weatherinfo&:{&city&:&北京&,&cityid&:&&,&temp&:&19&,&WD&:&南风&,&WS&:&2级&,&SD&:&43%&,&WSE&:&2&,&time&:&19:45&,&isRadar&:&1&,&Radar&:&JC_RADAR_AZ9010_JB&}}接下来我们使用对象的方式将这段JSON字符串表示出来。新建一个Weather类,代码如下所示:public class Weather {
private WeatherI
public WeatherInfo getWeatherinfo() {
public void setWeatherinfo(WeatherInfo weatherinfo) {
this.weatherinfo =
}Weather类中只是引用了WeatherInfo这个类。接着新建WeatherInfo类,代码如下所示:public class WeatherInfo {
public String getCity() {
public void setCity(String city) {
this.city =
public String getTemp() {
public void setTemp(String temp) {
this.temp =
public String getTime() {
public void setTime(String time) {
this.time =
}WeatherInfo类中含有city、temp、time这几个字段。下面就是如何调用GsonRequest了,其实也很简单,代码如下所示:GsonRequest&Weather& gsonRequest = new GsonRequest&Weather&(
&.cn/data/sk/.html&, Weather.class,
new Response.Listener&Weather&() {
public void onResponse(Weather weather) {
WeatherInfo weatherInfo = weather.getWeatherinfo();
Log.d(&TAG&, &city is & + weatherInfo.getCity());
Log.d(&TAG&, &temp is & + weatherInfo.getTemp());
Log.d(&TAG&, &time is & + weatherInfo.getTime());
}, new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
Log.e(&TAG&, error.getMessage(), error);
mQueue.add(gsonRequest);可以看到,这里onResponse()方法的回调中直接返回了一个Weather对象,我们通过它就可以得到WeatherInfo对象,接着就能从中取出JSON中的相关数据了。现在运行一下代码,观察控制台日志,打印数据如下图所示:这样的话,XMLRequest和GsonRequest的功能就基本都实现了,我们也是借助这两个例子深刻地理解了自定义Request的方法,对Volley的认识也是更加深入了。好了,本篇文章就到此结束,下篇文章中我们将对Volley进行更深层次的研究,感兴趣的朋友请继续阅读。关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。
微信扫一扫下方二维码即可关注:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5652535次
积分:36937
积分:36937
排名:第91名
原创:94篇
评论:12122条
《第二行代码》已出版新书基于Android 7.0系统全面升级全书使用Android Studio 2.2进行开发更加入了许多振奋人心的新技术
网上购买:
关注我的技术公众号,每天都有优质技术文章推送。
关注我的娱乐公众号,工作、学习累了的时候放松一下自己。
微信扫一扫上方二维码即可关注
感兴趣的朋友可以加入我的QQ群,一起讨论学习,共同进步。
阅读:389815
(1)(2)(1)(1)(1)(1)(2)(1)(1)(2)(1)(1)(2)(1)(1)(1)(1)(1)(1)(1)(2)(2)(3)(1)(2)(5)(3)(3)(2)(1)(3)(1)(2)(5)(4)(4)(4)(4)(5)(5)(5)(6)(4)}

我要回帖

更多关于 http parser settings 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信