JSON

与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件(2)

字号+ 作者:H5之家 来源:H5之家 2015-10-06 14:13 我要评论( )

修改Handler中消息处理中解析json数据的代码,这次改用GSON方式解析: 1 Gson gson = new Gson(); 2 3 ResponseInfo info = gson.fromJson(str, ResponseInfo. class ); 4 5 Toast.makeText(MainActivity. this , i

修改Handler中消息处理中解析json数据的代码,这次改用GSON方式解析:

1 Gson gson = new Gson(); 2 3 ResponseInfo info = gson.fromJson(str, ResponseInfo.class); 4 5 Toast.makeText(MainActivity.this, info.getErrorCode()+info.getErrorMsg(), Toast.LENGTH_LONG).show();

注意到,使用GSON的方式解析到实体类对象非常简单:

没有特别的需求时,使用默认构造创建GSON实例即可,需要特殊的配置时,可以使用GsonBuilder来创建GSON实例,具体参考说明文档

调用fromJson()传入要解析的数据,及解析后的对象类型,即可完成从json格式字符串到实体类对象的解析。

若是json array形式的字符串,解析则稍微麻烦一点:

如:想要解析[{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"}]为List<ResponseInfo>

但是不能List<ResponseInfo>.class,这时GSON中提供了获取泛型的类型信息的方法:

使用TypeToken:

TypeToken< List<ResponseInfo>> list = new TypeToken< List<ResponseInfo>>() {};

 

然后调用list.getType()注意返回的是Type类型的对象,而Gson的fromJson()方法刚好有第二个参数为Type类型的重载形式。

所以,对[{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"}]解析的具体代码如下:

1 Gson gson = new Gson(); 2 3 TypeToken<List<ResponseInfo>> list = new TypeToken<List<ResponseInfo>>(){}; 4 5 List<ResponseInfo> info_list = gson.fromJson(str, list.getType());

 

以上,就是两种对json形式数据的解析方式。

与服务器交互的方式除了内置的HttpURLConnection和HttpClient之外,还可以选择一些优秀的开源项目,来简化与服务端交互的工作,如使用AsyncHttpClient:

AsyncHttpClient可以到github上获取:

 

在github中搜说async-http即可找到该项目,然后clone或者下载zip包就可以获得该项目了。

在自己的项目中使用async-http的方式如同GSON,也可以直接使用源码,或者引用jar包,根据个人喜好即可。

简单演示下async-http发送get和post请求的示例:

在MainActivity中添加两个方法:

使用AsyncHttpClient发送get请求:

async_get_test(){ 2 3 String username = et_username.getText().toString(); 4 5 String password = et_password.getText().toString(); 6 7 AsyncHttpClient client = new AsyncHttpClient(); 8 9 client.get("http://10.0.2.2/index.php?username="+username+"&password="+password, new AsyncHttpResponseHandler() { @Override onSuccess(int statusCode, Header[] headers, byte[] responseBody) { Message msg = new Message(); 20 21 msg.what = OK; 22 23 msg.obj = new String(responseBody); 24 25 handler.sendMessage(msg); 26 27 } @Override onFailure(int statusCode, Header[] headers, [] responseBody, Throwable error) { Message msg = new Message(); 40 41 msg.what = OK; 42 43 msg.obj = new String(responseBody); 44 45 handler.sendMessage(msg); 46 47 } 48 49 }); 50 51 }

使用AsyncHttpClient发送post请求:

     

async_post_test(){ 2 3 String username = et_username.getText().toString(); 4 5 String password = et_password.getText().toString(); 6 7 AsyncHttpClient client = new AsyncHttpClient(); 8 9 RequestParams params = new RequestParams(); 10 11 params.add("username", username); 12 13 params.add("password", password); 14 15 client.post("http://10.0.2.2/index.php", params , new AsyncHttpResponseHandler() { @Override onSuccess(int statusCode, Header[] headers, byte[] responseBody) { Message msg = new Message(); 26 27 msg.what = OK; 28 29 msg.obj = new String(responseBody); 30 31 handler.sendMessage(msg); 32 33 } @Override onFailure(int statusCode, Header[] headers, [] responseBody, Throwable error) { Message msg = new Message(); 46 47 msg.what = OK; 48 49 msg.obj = new String(responseBody); 50 51 handler.sendMessage(msg); 52 53 } 54 55 }); 56 57 }

 

可以看到使用AsyncHttpClient的方式非常简单:

get方式:

创建AsyncHttpClient对象,然后调用get方法即可。

唯一稍微复杂的就是get方法的第二个参数:AsyncHttpResponseHandler,需要创建一个匿名内部类对象,然后重写AsyncHttpResponseHandler的两个方法,分别是网络请求成功的回调方法及网络请求失败的回调方法。

post方式:

就比get方式多了一个传递参数而已:

RequestParams params = new RequestParams();

params.add("username", username);

params.add("password", password);

使用RequestParams对象存放要提交的参数,然后将其传递给post()方法即可。

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评