android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6971字,纯文字阅读大概需要10分钟。
内容图文
补充:关于PHP服务端可能出现的问题:
如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!!
在android应用中访问的IP都是10.0.2.2,如果在apache虚拟主机配置文件中配置了多个虚拟主机,那么将默认解析为对第一个虚拟主机的请求,所以,在调试android应用时,应该将对应的服务端所配置的那个虚拟主机放在配置文件中的第一个虚拟主机的位置。否则就会出现请求的文件不存在等的错误。
服务端返回JSON数据及在android应用中解析JSON数据:
1.新建一个json.php文件,返回json格式的数据:
1 <?php 2 3if(isset($_REQUEST["username"])&& isset($_REQUEST["password"])){ 4 5$username = $_REQUEST["username"]; 6 7$password = $_REQUEST["password"]; 8 9if($username == "zhangsan" && $password == "123"){ 1011$arr = array( 1213 "errorCode"=>200, 1415 "errorMsg"=>"login success" 1617 ); 1819echo json_encode($arr); 2021 }else{ 2223$arr = array( 2425 "errorCode"=>404, 2627 "errorMsg"=>"login failure" 2829 ); 3031echo json_encode($arr); 3233 } 3435 }else{ 3637$arr = array( 3839 "errorCode"=>500, 4041 "errorMsg"=>"illeagle params" 4243 ); 4445echo json_encode($arr); 4647} 4849 ?>
返回的信息格式如下:
{"errorCode":500,"errorMsg":"illeagle params"}
一个大括号内的表示的是一个json对象,内部存储的是键值对数据,键与值用冒号分隔,多个键值对之间用逗号分隔。
形式如同下面格式的是json array对象:
[{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"}]
中括号里面存放的是用逗号分隔的一个个json对象。
2.Android中要解析json格式数据需要用到的类有JSONObject和JSONArray:
JSONObject直接使用传入字符串形式的参数的构造方法创建JSONObject实例,然后调用相应的get方法,即可获取json形式数据中的每个键对应的值。
当返回的数据是用中括号括着的多个json形式字符串是,就要用到JSONArray了,同样可以使用字符串参数构造出JSONArray实例,然后可以使用下标的形式获取到其中的每一个JSONObject对象,然后使用JSONObject的方法分别取解析即可。
简单使用示例:
在MainActivity中添加上修改Handler的消息处理方法,当前通过get或者post取得的是json格式的数据,所以添加上对json数据的解析:
1 private Handler handler = new Handler(){ 2 3publicvoid handleMessage(android.os.Message msg) { 4 5if(msg.what == OK){ 6 7 String str = msg.obj.toString(); 8 9try { 1011 JSONObject obj = new JSONObject(str); 1213 Log.i(TAG,obj.getString("errorCode")); 1415 Log.i(TAG,obj.getString("errorMsg")); 1617 } catch (JSONException e) { 1819// TODO Auto-generated catch block2021 e.printStackTrace(); 2223 } 24252627 } 2829 } 3031 };
运行结果:
有时候,服务端返回的可能是一些实体类信息,若用户登录成功,返回存放用户个人信息用以缓存在本地,这时,可能希望直接能将返回的JSON格式的数据解析为实体类对象,以简化操作。使用JSONObject类当然也能实现,只要获取到各个字段的值,然后通过它们构造实体类对象即可。但是,还有更简单的方式,那就是使用GSON。
3.使用GSON解析json数据:
要在自己项目中使用GSON,有两种方式:
方式1:从网上下载gson的jar包,放到项目的libs目录中,然后添加到项目的build path中,就可以直接使用GSON了
方式2:下载GSON的源码,可以到github上下载,然后把源码整个复制到src目录下,之后也可以直接使用GSON了。
下面是GSON的简单使用示例,更多的使用可以参考GSON的帮助文档:在下载源码的包中有docs目录,里面就是GSON使用的帮助文档,可以在需要时参考。
新建一个实体类,存放返回的errorCode和errorMsg:
1 package cn.csc.start.bean; 2 3 4 5 public class ResponseInfo { 6 7 private int errorCode; 8 9 private String errorMsg; 10 11 public int getErrorCode() { 12 13 return errorCode; 14 15 } 16 17 public void setErrorCode(int errorCode) { 1819this.errorCode = errorCode; 2021 } 2223public String getErrorMsg() { 2425return errorMsg; 2627 } 2829publicvoid setErrorMsg(String errorMsg) { 3031this.errorMsg = errorMsg; 3233 } 3435public ResponseInfo(int errorCode, String errorMsg) { 3637super(); 3839this.errorCode = errorCode; 4041this.errorMsg = errorMsg; 4243 } 4445public ResponseInfo() { 4647super(); 4849 } 5051 }
修改Handler中消息处理中解析json数据的代码,这次改用GSON方式解析:
1 Gson gson = new Gson(); 23 ResponseInfo info = gson.fromJson(str, ResponseInfo.class); 45 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(); 23 TypeToken<List<ResponseInfo>> list = new TypeToken<List<ResponseInfo>>(){}; 45 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请求:
1 private void 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() { 10111213 @Override 1415publicvoid onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 1617// TODO Auto-generated method stub1819 Message msg = new Message(); 2021 msg.what = OK; 2223 msg.obj = new String(responseBody); 2425 handler.sendMessage(msg); 2627 } 28293031 @Override 3233publicvoid onFailure(int statusCode, Header[] headers, 3435byte[] responseBody, Throwable error) { 3637// TODO Auto-generated method stub3839 Message msg = new Message(); 4041 msg.what = OK; 4243 msg.obj = new String(responseBody); 4445 handler.sendMessage(msg); 4647 } 4849 }); 5051 }
使用AsyncHttpClient发送post请求:
1 private void 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(); 1011 params.add("username", username); 1213 params.add("password", password); 1415 client.post("http://10.0.2.2/index.php", params , new AsyncHttpResponseHandler() { 16171819 @Override 2021publicvoid onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 2223// TODO Auto-generated method stub2425 Message msg = new Message(); 2627 msg.what = OK; 2829 msg.obj = new String(responseBody); 3031 handler.sendMessage(msg); 3233 } 34353637 @Override 3839publicvoid onFailure(int statusCode, Header[] headers, 4041byte[] responseBody, Throwable error) { 4243// TODO Auto-generated method stub4445 Message msg = new Message(); 4647 msg.what = OK; 4849 msg.obj = new String(responseBody); 5051 handler.sendMessage(msg); 5253 } 5455 }); 5657 }
可以看到使用AsyncHttpClient的方式非常简单:
get方式:
创建AsyncHttpClient对象,然后调用get方法即可。
唯一稍微复杂的就是get方法的第二个参数:AsyncHttpResponseHandler,需要创建一个匿名内部类对象,然后重写AsyncHttpResponseHandler的两个方法,分别是网络请求成功的回调方法及网络请求失败的回调方法。
post方式:
就比get方式多了一个传递参数而已:
RequestParams params = new RequestParams();
params.add("username", username);
params.add("password", password);
使用RequestParams对象存放要提交的参数,然后将其传递给post()方法即可。
原文:http://www.cnblogs.com/dqrcsc/p/4646591.html
内容总结
以上是互联网集市为您收集整理的android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据全部内容,希望文章能够帮你解决android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。