您的位置:首页 > 移动开发 > Android开发

android客户端从服务器端获取json数据并解析

2013-10-02 17:58 671 查看
今天总结一下:首先客户端从服务器端获取json数据1、利用HttpUrlConnection
1 /**
2      * 从指定的URL中获取数组
3      * @param urlPath
4      * @return
5      * @throws Exception
6      */
7     public static String readParse(String urlPath) throws Exception {
8                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
9                byte[] data = new byte[1024];
10                 int len = 0;
11                 URL url = new URL(urlPath);
12                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
13                 InputStream inStream = conn.getInputStream();
14                 while ((len = inStream.read(data)) != -1) {
15                     outStream.write(data, 0, len);
16                 }
17                 inStream.close();
18                 return new String(outStream.toByteArray());//通过out.Stream.toByteArray获取到写的数据
19             }
2、利用HttpClient
1 /**
2      * 访问数据库并返回JSON数据字符串
3      *
4      * @param params 向服务器端传的参数
5      * @param url
6      * @return
7      * @throws Exception
8      */
9     public static String doPost(List<NameValuePair> params, String url)
10             throws Exception {
11         String result = null;
12         // 获取HttpClient对象
13         HttpClient httpClient = new DefaultHttpClient();
14         // 新建HttpPost对象
15         HttpPost httpPost = new HttpPost(url);
16         if (params != null) {
17             // 设置字符集
18             HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
19             // 设置参数实体
20             httpPost.setEntity(entity);
21         }
22
23         /*// 连接超时
24         httpClient.getParams().setParameter(
25                 CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
26         // 请求超时
27         httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
28                 3000);*/
29         // 获取HttpResponse实例
30         HttpResponse httpResp = httpClient.execute(httpPost);
31         // 判断是够请求成功
32         if (httpResp.getStatusLine().getStatusCode() == 200) {
33             // 获取返回的数据
34             result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
35         } else {
36             Log.i("HttpPost", "HttpPost方式请求失败");
37         }
38
39         return result;
40     }
其次Json数据解析:json数据:[{"id":"67","biaoTi":"G","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741845270.png","logoLunbo":"http://www.nuoter.com/wtserver/resources/upload/13509015004480.jpg","yuanJia":"0","xianJia":"0"},{"id":"64","biaoTi":"444","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741704400.png","logoLunbo":"http://172.16.1.75:8080/wtserver/resources/upload/13508741738500.png","yuanJia":"0","xianJia":"0"},{"id":"62","biaoTi":"jhadasd","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741500450.png","logoLunbo":"http://172.16.1.75:8080/wtserver/resources/upload/13508741557450.png","yuanJia":"1","xianJia":"0"}]
1 /**
2      * 解析
3      *
4      * @throws JSONException
5      */
6     private static ArrayList<HashMap<String, Object>> Analysis(String jsonStr)
7             throws JSONException {
8         /******************* 解析 ***********************/
9         JSONArray jsonArray = null;
10         // 初始化list数组对象
11         ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
12         jsonArray = new JSONArray(jsonStr);
13         for (int i = 0; i < jsonArray.length(); i++) {
14             JSONObject jsonObject = jsonArray.getJSONObject(i);
15             // 初始化map数组对象
16             HashMap<String, Object> map = new HashMap<String, Object>();
17             map.put("logo", jsonObject.getString("logo"));
18             map.put("logoLunbo", jsonObject.getString("logoLunbo"));
19             map.put("biaoTi", jsonObject.getString("biaoTi"));
20             map.put("yuanJia", jsonObject.getString("yuanJia"));
21             map.put("xianJia", jsonObject.getString("xianJia"));
22             map.put("id", jsonObject.getInt("id"));
23             list.add(map);
24         }
25         return list;
26     }
最后数据适配:1、TextView
1 /**
2  * readParse(String)从服务器端获取数据
3  * Analysis(String)解析json数据
4  */
5     private void resultJson() {
6         try {
7             allData = Analysis(readParse(url));
8             Iterator<HashMap<String, Object>> it = allData.iterator();
9             while (it.hasNext()) {
10                 Map<String, Object> ma = it.next();
11                 if ((Integer) ma.get("id") == id) {
12                     biaoTi.setText((String) ma.get("biaoTi"));
13                     yuanJia.setText((String) ma.get("yuanJia"));
14                     xianJia.setText((String) ma.get("xianJia"));
15                 }
16             }
17         } catch (JSONException e) {
18             e.printStackTrace();
19         } catch (Exception e) {
20             e.printStackTrace();
21         }
22     }
2、ListView:
1 /**
2      * ListView 数据适配
3      */
4     private void product_data(){
5         List<HashMap<String, Object>> lists = null;
6         try {
7             lists = Analysis(readParse(url));//解析出json数据
8         } catch (Exception e) {
9             // TODO Auto-generated catch block
10             e.printStackTrace();
11         }
12         List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
13         for(HashMap<String, Object> news : lists){
14             HashMap<String, Object> item = new HashMap<String, Object>();
15             item.put("chuXingTianShu", news.get("chuXingTianShu"));
16             item.put("biaoTi", news.get("biaoTi"));
17             item.put("yuanJia", news.get("yuanJia"));
18             item.put("xianJia", news.get("xianJia"));
19             item.put("id", news.get("id"));
20
21             try {
22                 bitmap = ImageService.getImage(news.get("logo").toString());//图片从服务器上获取
23             } catch (Exception e) {
24                 // TODO Auto-generated catch block
25                 e.printStackTrace();
26             }
27             if(bitmap==null){
28                 Log.i("bitmap", ""+bitmap);
29                 Toast.makeText(TravelLine.this, "图片加载错误", Toast.LENGTH_SHORT)
30                 .show();                                         // 显示图片编号
31             }
32             item.put("logo",bitmap);
33             data.add(item);
34         }
35              listItemAdapter = new MySimpleAdapter1(TravelLine.this,data,R.layout.a_travelline_item,
36                         // 动态数组与ImageItem对应的子项
37                         new String[] { "logo", "biaoTi",
38                                 "xianJia", "yuanJia", "chuXingTianShu"},
39                         // ImageItem的XML文件里面的一个ImageView,两个TextView ID
40                         new int[] { R.id.trl_ItemImage, R.id.trl_ItemTitle,
41                                 R.id.trl_ItemContent, R.id.trl_ItemMoney,
42                                 R.id.trl_Itemtoday});
43                 listview.setAdapter(listItemAdapter);
44                 //添加点击
45                 listview.setOnItemClickListener(new OnItemClickListener() {
46                     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
47                             long arg3) {
48                         login_publicchannel_trl_sub(arg2);
49                     }
50                 });
51     }
对于有图片的要重写适配器
1 package com.nuoter.adapterUntil;
2
3
4 import java.util.HashMap;
5 import java.util.List;
6
7
8 import android.content.Context;
9 import android.graphics.Bitmap;
10 import android.graphics.BitmapFactory;
11 import android.graphics.Paint;
12 import android.net.Uri;
13 import android.view.LayoutInflater;
14 import android.view.View;
15 import android.view.ViewGroup;
16 import android.widget.BaseAdapter;
17 import android.widget.ImageView;
18 import android.widget.LinearLayout;
19 import android.widget.TextView;
20
21
22 public class MySimpleAdapter1 extends BaseAdapter {
23     private LayoutInflater mInflater;
24     private List<HashMap<String, Object>> list;
25     private int layoutID;
26     private String flag[];
27     private int ItemIDs[];
28     public MySimpleAdapter1(Context context, List<HashMap<String, Object>> list,
29             int layoutID, String flag[], int ItemIDs[]) {
30         this.mInflater = LayoutInflater.from(context);
31         this.list = list;
32         this.layoutID = layoutID;
33         this.flag = flag;
34         this.ItemIDs = ItemIDs;
35     }
36     @Override
37     public int getCount() {
38         // TODO Auto-generated method stub
39         return list.size();
40     }
41     @Override
42     public Object getItem(int arg0) {
43         // TODO Auto-generated method stub
44         return 0;
45     }
46     @Override
47     public long getItemId(int arg0) {
48         // TODO Auto-generated method stub
49         return 0;
50     }
51     @Override
52     public View getView(int position, View convertView, ViewGroup parent) {
53         convertView = mInflater.inflate(layoutID, null);
54        // convertView = mInflater.inflate(layoutID, null);
55         for (int i = 0; i < flag.length; i++) {//备注1
56             if (convertView.findViewById(ItemIDs[i]) instanceof ImageView) {
57                 ImageView imgView = (ImageView) convertView.findViewById(ItemIDs[i]);
58                 imgView.setImageBitmap((Bitmap) list.get(position).get(flag[i]));///////////关键是这句!!!!!!!!!!!!!!!
59
60             }else if (convertView.findViewById(ItemIDs[i]) instanceof TextView) {
61                 TextView tv = (TextView) convertView.findViewById(ItemIDs[i]);
62                 tv.setText((String) list.get(position).get(flag[i]));
63             }else{
64                 //...备注2
65             }
66         }
67         //addListener(convertView);
68         return convertView;
69     }
70
71 /*    public void addListener(final View convertView) {
72
73         ImageView imgView = (ImageView)convertView.findViewById(R.id.lxs_item_image);
74
75
76
77     } */
78
79 }
对于图片的获取,json解析出来的是字符串url:"logoLunbo":http://www.nuoter.com/wtserver/resources/upload/13509015004480.jpg 从url获取 图片ImageService工具类
1 package com.nuoter.adapterUntil;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.InputStream;
5 import java.net.HttpURLConnection;
6 import java.net.URL;
7
8 import android.graphics.Bitmap;
9 import android.graphics.BitmapFactory;
10
11
12 public class ImageService {
13
14     /**
15      * 获取网络图片的数据
16      * @param path 网络图片路径
17      * @return
18      */
19     public static Bitmap getImage(String path) throws Exception{
20
21         /*URL url = new URL(imageUrl);
22         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
23         InputStream is = conn.getInputStream();
24         mBitmap = BitmapFactory.decodeStream(is);*/
25         Bitmap bitmap= null;
26         URL url = new URL(path);
27         HttpURLConnection conn = (HttpURLConnection) url.openConnection();//基于HTTP协议连接对象
28         conn.setConnectTimeout(5000);
29         conn.setRequestMethod("GET");
30         if(conn.getResponseCode() == 200){
31             InputStream inStream = conn.getInputStream();
32             bitmap = BitmapFactory.decodeStream(inStream);
33         }
34         return bitmap;
35     }
36
37     /**
38      * 读取流中的数据 从url获取json数据
39      * @param inStream
40      * @return
41      * @throws Exception
42      */
43     public static byte[] read(InputStream inStream) throws Exception{
44         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
45         byte[] buffer = new byte[1024];
46         int len = 0;
47         while( (len = inStream.read(buffer)) != -1){
48             outStream.write(buffer, 0, len);
49         }
50         inStream.close();
51         return outStream.toByteArray();
52     }
53
54
55 }
上面也将从url处获取网络数据写在了工具类ImageService中方面调用,因为都是一样的。当然也可以在Activity类中写一个获取服务器图片的函数(当用处不多时)
1  /*
2
3      * 从服务器取图片
4      * 参数:String类型
5      * 返回:Bitmap类型
6
7      */
8
9     public static Bitmap getHttpBitmap(String urlpath) {
10         Bitmap bitmap = null;
11         try {
12             //生成一个URL对象
13             URL url = new URL(urlpath);
14             //打开连接
15             HttpURLConnection conn = (HttpURLConnection)url.openConnection();
16 //            conn.setConnectTimeout(6*1000);
17 //            conn.setDoInput(true);
18             conn.connect();
19             //得到数据流
20             InputStream inputstream = conn.getInputStream();
21             bitmap = BitmapFactory.decodeStream(inputstream);
22             //关闭输入流
23             inputstream.close();
24             //关闭连接
25             conn.disconnect();
26         } catch (Exception e) {
27             Log.i("MyTag", "error:"+e.toString());
28         }
29         return bitmap;
30     }
调用:
1 public ImageView pic;
2 .....
3 .....
4 allData=Analysis(readParse(url));
5 Iterator<HashMap<String, Object>> it=allData.iterator();
6 while(it.hasNext()){
7 Map<String, Object> ma=it.next();
8 if((Integer)ma.get("id")==id)
9 {
10 logo=(String) ma.get("logo");
11 bigpic=getHttpBitmap(logo);
12 }
13 }
14 pic.setImageBitmap(bigpic);
另附 下载数据很慢时建立子线程并传参:
1 new Thread() {
2             @Override
3             public void run() {
4                 // 参数列表
5                 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
6                 nameValuePairs.add(new BasicNameValuePair("currPage", Integer
7                         .toString(1)));
8                 nameValuePairs.add(new BasicNameValuePair("pageSize", Integer
9                         .toString(5)));
10                 try {
11                     String result = doPost(nameValuePairs, POST_URL);
12                     Message msg = handler.obtainMessage(1, 1, 1, result);
13                     handler.sendMessage(msg);                     // 发送消息
14                 } catch (Exception e) {
15                     // TODO Auto-generated catch block
16                     e.printStackTrace();
17                 }
18             }
19         }.start();
20
21         // 定义Handler对象
22         handler = new Handler() {
23             public void handleMessage(Message msg) {
24                 switch (msg.what) {
25                 case 1:{
26                     // 处理UI
27                     StringBuffer strbuf = new StringBuffer();
28                     List<HashMap<String, Object>> lists = null;
29                     try {
30                         lists = MainActivity.this
31                                 .parseJson(msg.obj.toString());
32                     } catch (Exception e) {
33                         // TODO Auto-generated catch block
34                         e.printStackTrace();
35                     }
36                     List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
37                     for(HashMap<String, Object> news : lists){
38                         HashMap<String, Object> item = new HashMap<String, Object>();
39                         item.put("id", news.get("id"));
40                         item.put("ItemText0", news.get("name"));
41
42                         try {
43                             bitmap = ImageService.getImage(news.get("logo").toString());
44                         } catch (Exception e) {
45                             // TODO Auto-generated catch block
46                             e.printStackTrace();
47                         }
48                         if(bitmap==null){
49                             Log.i("bitmap", ""+bitmap);
50                             Toast.makeText(MainActivity.this, "图片加载错误", Toast.LENGTH_SHORT)
51                             .show();                                         // 显示图片编号
52                         }
53                         item.put("ItemImage",bitmap);
54                         data.add(item);
55                     }
56
57                     //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应
58                     MySimpleAdapter saImageItems = new MySimpleAdapter(MainActivity.this, data,
59                             R.layout.d_travelagence_item,
60                             new String[] {"ItemImage", "ItemText0", "ItemText1"},
61                             new int[] {R.id.lxs_item_image, R.id.lxs_item_text0, R.id.lxs_item_text1});
62                     //添加并且显示
63                     gridview.setAdapter(saImageItems);
64                 }
65                     break;
66                 default:
67                     break;
68                 }
69
70
71             }
72         };
转载自:/article/4886553.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐