安卓大json文件解析_Android系列---JSON数据解析

一、什么是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)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

二.下面介绍一个例子(该例子也是借鉴网友的:附近地址:http://www.cnblogs.com/xiaoluo501395377/p/3446605.html)

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,大部分内容都是照搬的,不过其中过程中还是费了一点时间,如果觉得该文章太浅蒲,勿喷,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值