一、什么是json

json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。

json一共有两种数据结构,一种是以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。


例如:{"name": "xiaoluo"}, 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型


另一种数据格式就是有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。



二.下面介绍一个例子(该例子也是借鉴网友的)

1. 首先上结果图



简单的布局显示,第二幅图是要根据服务器的数据返回后显示出来的.

图一:

 图二:     


图一是服务端的文件,图二是客户端的文件

2. 首先看服务器上的代码



1 packagecom.bing.test;2 importjava.io.IOException;3 importjava.io.PrintWriter;4 importjava.util.ArrayList;5 importjava.util.HashMap;6 importjava.util.List;7 importjava.util.Map;8

9 importjavax.servlet.ServletException;10 importjavax.servlet.http.HttpServlet;11 importjavax.servlet.http.HttpServletRequest;12 importjavax.servlet.http.HttpServletResponse;13

14 importcom.alibaba.fastjson.JSON;15

16

17 public class CityServlet extendsHttpServlet{18

19 /**

20 */

21 private static final long serialVersionUID = 1L;22

23 publicCityServlet(){24 super();25 }26

27 protected voiddoGet(HttpServletRequest request,28 HttpServletResponse response) throwsServletException, IOException29 {30 this.doPost(request, response);31 }32

33 protected voiddoPost(HttpServletRequest request,34 HttpServletResponse response) throwsServletException, IOException35 {36

37 response.setContentType("text/html;charset=utf-8");38 request.setCharacterEncoding("utf-8");39 response.setCharacterEncoding("utf-8");40

41 PrintWriter writer =response.getWriter();42

43 String type = request.getParameter("type");44 if("json".equals(type)){45 List city = new ArrayList();46 city.add("上海");47 city.add("北京");48 city.add("重庆");49 city.add("四川");50 city.add("黑龙江");51

52 Map> map = new HashMap>();53 map.put("cities", city);54

55 String cityString =JSON.toJSONString(map);56 writer.println(cityString);57

58 //response.sendRedirect("index3.jsp");

59

60 }61 writer.flush();62 writer.close();63

64 }65

66

67

68 }

View Code

如果客户端请求的参数是type=json,则响应给客户端一个json数据格式

不过其中String cityString = JSON.toJSONString(map); JSON类需要用到图一中的一个jar包(WEB-INF/lib/下的fastjson-1.2.4.jar),是ali推出的.用着不错.

下面来看一下关于客户端的代码

(1).首先是样式布局


1 
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 tools:context="com.example.jsontest.MainActivity" >
6
7 
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:layout_alignParentTop="true"
12 android:layout_marginTop="50dp"
13 android:layout_centerInParent="true"/>
14
15 
17 android:layout_width="wrap_content"
18 android:layout_height="wrap_content"
19 android:layout_alignParentBottom="true"
20 android:layout_marginBottom="50dp"
21 android:layout_centerInParent="true"
22 android:text="@string/show"/>
23
24
25

View Code

布局文件so easy,没有什么好说的

(2). 然后是MainActivity



1 packagecom.example.jsontest;2
3 importjava.util.ArrayList;4 importjava.util.List;5
6 importandroid.app.Activity;7 importandroid.app.Dialog;8 importandroid.app.ProgressDialog;9 importandroid.os.Bundle;10 importandroid.os.Handler;11 importandroid.os.Message;12 importandroid.view.View;13 importandroid.widget.ArrayAdapter;14 importandroid.widget.Button;15 importandroid.widget.SimpleAdapter;16 importandroid.widget.Spinner;17
18
19 public class MainActivity extendsActivity {20
21 public static final int LOADING_DOWN = 0x0001;22
23 private List city = new ArrayList();24
25 private final String CITY_PATH_JSON = "http://10.1.8.142:8080/JSONTest/city?type=json";26
27 privateSpinner spinner;28 privateButton showBtn;29
30 privateProgressDialog dialog;31
32 public Handler handler = newHandler(){33 @Override34 public voidhandleMessage(Message msg) {35
36 switch(msg.what) {37 caseLOADING_DOWN:38 city = (List) msg.obj;39 showContent();40 break;41 default:42 break;43 }44 }45 };46
47
48
49 @Override50 protected voidonCreate(Bundle savedInstanceState) {51 super.onCreate(savedInstanceState);52 setContentView(R.layout.activity_main);53
54 initView();55
56 }57
58 private voidinitView(){59
60 showBtn =(Button) findViewById(R.id.showBtn);61 spinner =(Spinner) findViewById(R.id.city_show);62
63 dialog = new ProgressDialog(this);64 }65
66
67 @Override68 protected voidonStart() {69 super.onStart();70
71 if(city.size() == 0){72 city.add("城市");73 }else{74
75 }76
77 spinner.setAdapter(new ArrayAdapter(this, android.R.layout.simple_spinner_item, city));78 spinner.setSelection(0);79
80 showBtn.setOnClickListener(newButton.OnClickListener() {81 @Override82 public voidonClick(View view) {83 showCity();84 }85 });86
87 }88
89 private voidshowCity(){90
91 new MyAsyncTask(MainActivity.this, dialog).execute(CITY_PATH_JSON);92
93 }94
95
96 private voidshowContent(){97
98 spinner.setAdapter(new ArrayAdapter(this, android.R.layout.simple_spinner_item, city));99 spinner.setSelection(0);100 }101
102
103 }

View Code

private final String CITY_PATH_JSON = "http://10.1.8.142:8080/JSONTest/city?type=json";  IP地址换成自己本机上tomcat运行时的IP

然后是几个其它工具类等等

1. MyAsyncTast.java类 异步线程处理



1 packagecom.example.jsontest;2
3 importjava.io.IOException;4 importjava.util.ArrayList;5 importjava.util.List;6
7 importandroid.R.integer;8 importandroid.app.ProgressDialog;9 importandroid.content.Context;10 importandroid.os.AsyncTask;11 importandroid.os.Message;12 importandroid.util.Log;13
14 importcom.bing.tool.HttpUtils2;15 importcom.bing.tool.JsonUtils;16
17 public class MyAsyncTask extends AsyncTask>{18
19 private static final String TAG = "MyAsyncTask";20
21 public static final int LOADING_DOWN = 0x0001;22
23 private List result = new ArrayList();24
25 privateMainActivity activity;26
27 privateProgressDialog dialog;28
29 publicMyAsyncTask(Object obj){30
31 if(obj instanceofProgressDialog){32 this.dialog =(ProgressDialog)obj;33 }34 }35
36 publicMyAsyncTask(MainActivity activity, Object obj){37
38 if(obj instanceofProgressDialog){39 this.dialog =(ProgressDialog)obj;40 }41
42 if(activity instanceofMainActivity){43 this.activity =activity;44 }45 }46
47
48 @Override49 protected voidonPreExecute() {50
51 showDialog();52 }53
54 private voidshowDialog(){55 dialog.show();56 dialog.setTitle("提示信息");57 dialog.setMessage("loading......");58 dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);59 dialog.setCancelable(false);60 }61
62 @Override63 protected ListdoInBackground(String... arg0) {64
65 try{66 Log.i(TAG, "back content: " + arg0[0]);67 String content = HttpUtils2.sendPostMessage(arg0[0], "UTF-8");68
69 Log.i(TAG, "back content: " +content);70 result =JsonUtils.parseJsonContent(content);71
72 } catch(IOException e) {73 e.printStackTrace();74 }75
76 returnresult;77 }78
79
80 @Override81 protected void onPostExecute(Listresult) {82
83 Message msg = newMessage();84 msg.what =LOADING_DOWN;85 msg.obj =result;86 activity.handler.sendMessage(msg);87 dialog.dismiss();88
89 }90
91
92 }

View Code

2. JsonUtils.java 类,用于处理JSONObject



1 packagecom.bing.tool;2
3 importjava.util.ArrayList;4 importjava.util.List;5
6 importorg.json.JSONArray;7 importorg.json.JSONException;8 importorg.json.JSONObject;9
10 public classJsonUtils {11
12
13 /**
14 *@paramcontent15 *@return
16 */
17 public static ListparseJsonContent(String content){18
19 List contents = new ArrayList();20
21 JSONObject jsonObj;22 try{23 jsonObj = newJSONObject(content);24
25 JSONArray jsonArray = jsonObj.getJSONArray("cities");26
27 for(int i = 0; i < jsonArray.length(); i++){28
29 contents.add(jsonArray.getString(i));30 }31
32 }catch(JSONException e) {33 e.printStackTrace();34 }35
36 returncontents;37
38 }39
40
41 }

View Code

3. HttpUtils2.java类,用于请求报务器获取所得的数据



1 packagecom.bing.tool;2
3 importjava.io.IOException;4 importjava.io.InputStreamReader;5
6 importorg.apache.http.HttpEntity;7 importorg.apache.http.HttpResponse;8 importorg.apache.http.HttpStatus;9 importorg.apache.http.client.ClientProtocolException;10 importorg.apache.http.client.HttpClient;11 importorg.apache.http.client.methods.HttpGet;12 importorg.apache.http.impl.client.DefaultHttpClient;13 importorg.apache.http.util.EntityUtils;14
15 importandroid.util.Log;16
17 public classHttpUtils2 {18
19 public static String sendPostMessage(String url, String encode) throwsIOException{20
21 String result = null;22 HttpGet request = newHttpGet(url);23 HttpClient httpClient = newDefaultHttpClient();24
25 try{26 HttpResponse response =httpClient.execute(request);27 if(response.getStatusLine().getStatusCode() ==HttpStatus.SC_OK){28 Log.i("here", "here");29 HttpEntity httpEntity =response.getEntity();30 if(httpEntity != null){31 result =EntityUtils.toString(httpEntity);32 Log.i("result", "result: " +result);33 }34 }35
36 }catch(Exception e) {37 e.printStackTrace();38 }finally{39 httpClient.getConnectionManager().shutdown();40 }41
42 returnresult;43
44 }45
46
47 }

View Code

4. AndoridMainfest.xml

当然别往了开启我们的网络授权

5. 运行程序

跑程序,就可以完成了客户端与服务器端通过json来进行数据的交换

在这过程中遇到一些问题:

1. at org.apache.catalina.loader.WebappClassLoader.loadClass. 就是关于导包的问题

过程中不知什么原因,不过将包放在WEB-INF/lib/下,然后build bath就可以了.

新手学android,大部分内容都是照搬的,不过其中过程中还是费了一点时间,如果觉得该文章太浅蒲,勿喷,谢谢