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 package com.bing.test;
 2 import java.io.IOException;
 3 import java.io.PrintWriter;
 4 import java.util.ArrayList;
 5 import java.util.HashMap;
 6 import java.util.List;
 7 import java.util.Map;
 8
 9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import com.alibaba.fastjson.JSON;
15
16
17 public class CityServlet extends HttpServlet{
18
19     /**
20      */
21     private static final long serialVersionUID = 1L;
22
23     public CityServlet(){
24         super();
25     }
26
27     protected void doGet(HttpServletRequest request,
28             HttpServletResponse response) throws ServletException, IOException
29     {
30         this.doPost(request, response);
31     }
32
33     protected void doPost(HttpServletRequest request,
34             HttpServletResponse response) throws ServletException, IOException
35     {
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<String> city = new ArrayList<String>();
46             city.add("上海");
47             city.add("北京");
48             city.add("重庆");
49             city.add("四川");
50             city.add("黑龙江");
51
52             Map<String, List<String>> map = new HashMap<String, List<String>>();
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 }

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

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

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

(1).首先是样式布局

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 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     <Spinner
 8         android:id="@+id/city_show"
 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     <Button
16         android:id="@+id/showBtn"
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 </RelativeLayout>

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

(2). 然后是MainActivity

  1 package com.example.jsontest;
  2
  3 import java.util.ArrayList;
  4 import java.util.List;
  5
  6 import android.app.Activity;
  7 import android.app.Dialog;
  8 import android.app.ProgressDialog;
  9 import android.os.Bundle;
 10 import android.os.Handler;
 11 import android.os.Message;
 12 import android.view.View;
 13 import android.widget.ArrayAdapter;
 14 import android.widget.Button;
 15 import android.widget.SimpleAdapter;
 16 import android.widget.Spinner;
 17
 18
 19 public class MainActivity extends Activity {
 20
 21     public static final int LOADING_DOWN = 0x0001;
 22
 23     private List<String> city = new ArrayList<String>();
 24
 25     private final String CITY_PATH_JSON = "http://10.1.8.142:8080/JSONTest/city?type=json";
 26
 27     private Spinner spinner;
 28     private Button showBtn;
 29
 30     private ProgressDialog dialog;
 31
 32     public Handler handler = new Handler(){
 33         @Override
 34         public void handleMessage(Message msg) {
 35
 36             switch (msg.what) {
 37             case LOADING_DOWN:
 38                 city = (List<String>) msg.obj;
 39                 showContent();
 40                 break;
 41             default:
 42                 break;
 43             }
 44         }
 45     };
 46
 47
 48
 49     @Override
 50     protected void onCreate(Bundle savedInstanceState) {
 51         super.onCreate(savedInstanceState);
 52         setContentView(R.layout.activity_main);
 53
 54         initView();
 55
 56     }
 57
 58     private void initView(){
 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     @Override
 68     protected void onStart() {
 69         super.onStart();
 70
 71         if(city.size() == 0){
 72             city.add("城市");
 73         }else{
 74
 75         }
 76
 77         spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, city));
 78         spinner.setSelection(0);
 79
 80         showBtn.setOnClickListener(new Button.OnClickListener() {
 81             @Override
 82             public void onClick(View view) {
 83                 showCity();
 84             }
 85         });
 86
 87     }
 88
 89     private void showCity(){
 90
 91         new MyAsyncTask(MainActivity.this, dialog).execute(CITY_PATH_JSON);
 92
 93     }
 94
 95
 96     private void showContent(){
 97
 98         spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, city));
 99         spinner.setSelection(0);
100     }
101
102
103 }

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

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

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

 1 package com.example.jsontest;
 2
 3 import java.io.IOException;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6
 7 import android.R.integer;
 8 import android.app.ProgressDialog;
 9 import android.content.Context;
10 import android.os.AsyncTask;
11 import android.os.Message;
12 import android.util.Log;
13
14 import com.bing.tool.HttpUtils2;
15 import com.bing.tool.JsonUtils;
16
17 public class MyAsyncTask extends AsyncTask<String, integer, List<String>> {
18
19     private static final String TAG = "MyAsyncTask";
20
21     public static final int LOADING_DOWN = 0x0001;
22
23     private List<String> result = new ArrayList<String>();
24
25     private MainActivity activity;
26
27     private ProgressDialog dialog;
28
29     public MyAsyncTask(Object obj){
30
31         if(obj instanceof ProgressDialog){
32             this.dialog = (ProgressDialog)obj;
33         }
34     }
35
36     public MyAsyncTask(MainActivity activity, Object obj){
37
38         if(obj instanceof ProgressDialog){
39             this.dialog = (ProgressDialog)obj;
40         }
41
42         if(activity instanceof MainActivity){
43             this.activity = activity;
44         }
45     }
46
47
48     @Override
49     protected void onPreExecute() {
50
51         showDialog();
52     }
53
54     private void showDialog(){
55         dialog.show();
56         dialog.setTitle("提示信息");
57         dialog.setMessage("loading......");
58         dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
59         dialog.setCancelable(false);
60     }
61
62     @Override
63     protected List<String> doInBackground(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         return result;
77     }
78
79
80     @Override
81     protected void onPostExecute(List<String> result) {
82
83         Message msg = new Message();
84         msg.what = LOADING_DOWN;
85         msg.obj = result;
86         activity.handler.sendMessage(msg);
87         dialog.dismiss();
88
89     }
90
91
92 }

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

 1 package com.bing.tool;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import org.json.JSONArray;
 7 import org.json.JSONException;
 8 import org.json.JSONObject;
 9
10 public class JsonUtils {
11
12
13     /**
14      * @param content
15      * @return
16      */
17     public static List<String> parseJsonContent(String content){
18
19         List<String> contents = new ArrayList<String>();
20
21         JSONObject jsonObj;
22         try {
23             jsonObj = new JSONObject(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         return contents;
37
38     }
39
40
41 }

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

 1 package com.bing.tool;
 2
 3 import java.io.IOException;
 4 import java.io.InputStreamReader;
 5
 6 import org.apache.http.HttpEntity;
 7 import org.apache.http.HttpResponse;
 8 import org.apache.http.HttpStatus;
 9 import org.apache.http.client.ClientProtocolException;
10 import org.apache.http.client.HttpClient;
11 import org.apache.http.client.methods.HttpGet;
12 import org.apache.http.impl.client.DefaultHttpClient;
13 import org.apache.http.util.EntityUtils;
14
15 import android.util.Log;
16
17 public class HttpUtils2 {
18
19 public static String sendPostMessage(String url, String encode) throws IOException{
20
21         String result = null;
22         HttpGet request = new HttpGet(url);
23         HttpClient httpClient = new DefaultHttpClient();
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         return result;
43
44     }
45
46
47 }

4. AndoridMainfest.xml

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

<uses-permission android:name="android.permission.INTERNET"/>

5. 运行程序

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

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

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

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

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

时间: 2024-10-25 06:29:12

Android系列---JSON数据解析的相关文章

Android安卓——json数据解析

一.什么是json json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服 务器的数据交换格式往往通过json来进行交换.尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析. json一共有两种数据结构,一种是以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(

Android关于JSON数据解析

一.什么是json json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换.尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析. json一共有两种数据结构,一种是以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右

Android 实现Json数据解析,并进行应用

从网站上获取数据然后再客户端进行解析是常见的数据交互.下面是常用的一些接口网址: webservice工厂接口 http://www.36wu.com 快递查询接口http://webservice.36wu.com/ExpressService.asmx ip查询接口http://webservice.36wu.com/ipService.asmx 天气预报接口http://webservice.36wu.com/weatherService.asmx 身份证查询接口http://webser

Android: JSON数据解析--JSONlib与org.JSON的冲突

新注册了这个blog,正好这两天学写Android,需要解析本地的JSON文件,google一搜看到JSONlib这玩意儿挺靠谱,就大刀阔斧下了相关依赖包干了起来,没想到这下掉进了一个深坑,网上也查不到原因,在血海里翻腾了两天,如今好不容易爬了出来,与君分享,也作为开篇之作,不足之处还望指正. 对于初次解析JSON文件的童鞋可能会上网查找解析JSON文件的方法,于是网上有诸如JSONLIB, FASTJSON, GSON等方式,于是看的眼花撩乱. 其实..我想说,Android自带的org.js

Android的Json数据解析(二)

1)例子如{"id":"334E654000F1A85CC10798C019433B7B"} 是该String jsonString;的值 public void ParseJson(String jsonString) throws JSONException, ParseException { JSONObject jo = new JSONObject(jsonString); String strId = jo.getString("id"

Android JSON数据解析(GSON方式)

要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个Java对象,或是将一个Java对象转换为相应的JSON数据. 1.GSON的两个重要方法 在GSON的API中,提供了两个重要的方法:toJson()和fromJson()方法.其中,toJson()方法用来实现将Java对象转换为相应的JSON数据,fromJson()方法则用来实现将JSON数据转换

【Qt编程】基于Qt的词典开发系列&amp;lt;九&amp;gt;--JSON数据解析

在上一篇文章<用户登录及API调用的实现>中,我通过程序实现了用户登录及API调用的实现.从而能够实现网络查词.添词的操作.可是.从上文中能够看到.调用API后返回的是JSON格式的数据,例如以下图所看到的(在QtCreator中的显示): 为了更好的观察JSON格式.我整理后显演示样例如以下: 显然.为了显示查词的结果,我们必须在上图中提取实用的信息,并正确的显示出来. 上图中每一行内容的意思我已经在文章<调用网络API>中作了解释.我在词典中选择想要显示的内容有:单词本身.单词

Android网络之数据解析----使用Google Gson解析Json数据

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4063452.html 联系方式:[email protected] [正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                             

Android 之 json数据的解析(jsonReader)

json数据的解析相对而言,还是比较容易的,实现的代码也十分简单.这里用的是jsonReade方法来进行json数据解析. 1.在解析之前,大家需要知道什么是json数据. json数据存储的对象是无序的“名称/值”对的集合.和其他的数据存储方式相比,json数据的可读性,可扩展性,编码难度,解码难度都有一定的优势.在json数据中, 对于一个对象: (1)一个对象以“{”(左括号)开始,“}”(右括号)结束. (2)每个“名称”后跟一个“:”(冒号): (3)“‘名称/值’ 对”之间使用“,”