android客户端从服务器端获取json数据并解析的实现代码

Android在使用POST向服务端发送请求时返回的是json数据,这时就需要我们对json数据进行解析处理,以下是android客户端从服务器端获取json数据并解析的实现代码

1、利用HttpUrlConnection
/**
      *
从指定的URL中获取数组
      * @param urlPath
      * @return
      * @throws Exception
      */
     public static String readParse(String urlPath) throwsException {  
               ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
               byte[] data = new byte[1024];  
                int len = 0;  
                URL url = new URL(urlPath);  
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
                InputStream inStream = conn.getInputStream();  
                while ((len = inStream.read(data)) != -1) {  
                    outStream.write(data, 0, len);  
                }  
                inStream.close();  
                return new String(outStream.toByteArray());//通过out.Stream.toByteArray获取到写的数据  
             }

2、利用HttpClient

代码如下:


/**
      *
访问数据库并返回JSON数据字符串
      * 
      * @param params 向服务器端传的参数
      * @param url
      * @return
      * @throws Exception
      */
     public static String doPost(List<NameValuePair>params, String url)
             throwsException {
         String result = null;
         // 获取HttpClient对象
         HttpClient httpClient = newDefaultHttpClient();
         // 新建HttpPost对象
         HttpPost httpPost = newHttpPost(url);
         if (params != null) {
             // 设置字符集
            HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
             // 设置参数实体
            httpPost.setEntity(entity);
         }

         /*// 连接超时
        httpClient.getParams().setParameter(
                CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
         // 请求超时
        httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
                3000);*/
         // 获取HttpResponse实例
         HttpResponse httpResp =httpClient.execute(httpPost);
         // 判断是够请求成功
         if(httpResp.getStatusLine().getStatusCode() == 200) {
             // 获取返回的数据
             result= EntityUtils.toString(httpResp.getEntity(), "UTF-8");
         } else {
            Log.i("HttpPost", "HttpPost方式请求失败");
         }

         return result;
     }

其次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"}]

代码如下:


/**
      *
解析
      * 
      * @throws JSONException
      */
     private static ArrayList<HashMap<String,Object>> Analysis(String jsonStr)
             throwsJSONException {
         /*******************
解析 ***********************/
         JSONArray jsonArray = null;
         // 初始化list数组对象
        ArrayList<HashMap<String, Object>> list = newArrayList<HashMap<String, Object>>();
         jsonArray = newJSONArray(jsonStr);
         for (int i = 0; i <jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
             // 初始化map数组对象
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("logo", jsonObject.getString("logo"));
            map.put("logoLunbo", jsonObject.getString("logoLunbo"));
            map.put("biaoTi", jsonObject.getString("biaoTi"));
            map.put("yuanJia", jsonObject.getString("yuanJia"));
            map.put("xianJia", jsonObject.getString("xianJia"));
            map.put("id", jsonObject.getInt("id"));
            list.add(map);
         }
         return list;
     }

最后数据适配:

1、TextView

代码如下:


/**
  * readParse
(String)从服务器端获取数据
  * Analysis(String)解析json数据
  */
     private void resultJson() {
         try {
            allData = Analysis(readParse(url));
            Iterator<HashMap<String, Object>> it = allData.iterator();
             while(it.hasNext()) {
                Map<String, Object> ma = it.next();
                if ((Integer) ma.get("id") == id) {
                    biaoTi.setText((String) ma.get("biaoTi"));
                    yuanJia.setText((String) ma.get("yuanJia"));
                    xianJia.setText((String) ma.get("xianJia"));
                }
             }
         } catch (JSONException e) {
            e.printStackTrace();
         } catch (Exception e) {
            e.printStackTrace();
         }
     }

2、ListView

 代码如下:


/**
      * ListView
数据适配
      */
     private void product_data(){ 
         List<HashMap<String,Object>> lists = null;
         try {
             lists= Analysis(readParse(url));//
解析出json数据
         } catch (Exception e) {
             //TODO Auto-generated catch block
            e.printStackTrace();
         }
         List<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>();
         for(HashMap<String,Object> news : lists){
            HashMap<String, Object> item = new HashMap<String, Object>();
            item.put("chuXingTianShu", news.get("chuXingTianShu"));
            item.put("biaoTi", news.get("biaoTi"));
            item.put("yuanJia", news.get("yuanJia"));
            item.put("xianJia", news.get("xianJia"));
             item.put("id",news.get("id"));

             try {
                bitmap = ImageService.getImage(news.get("logo").toString());//图片从服务器上获取
             }catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
             }
            if(bitmap==null){
                Log.i("bitmap", ""+bitmap);
                Toast.makeText(TravelLine.this, "图片加载错误",Toast.LENGTH_SHORT)
                .show();                                        // 显示图片编号
             }
            item.put("logo",bitmap);
            data.add(item);
         }
             listItemAdapter = newMySimpleAdapter1(TravelLine.this,data,R.layout.a_travelline_item,
                        // 动态数组与ImageItem对应的子项
                        new String[] { "logo", "biaoTi",
                                "xianJia", "yuanJia", "chuXingTianShu"},
                        // ImageItem的XML文件里面的一个ImageView,两个TextView ID
                        new int[] { R.id.trl_ItemImage, R.id.trl_ItemTitle,
                                R.id.trl_ItemContent, R.id.trl_ItemMoney,
                                R.id.trl_Itemtoday});
                listview.setAdapter(listItemAdapter);
                //添加点击   
                listview.setOnItemClickListener(new OnItemClickListener() {    
                    public void onItemClick(AdapterView<?> arg0, View arg1, intarg2,   
                            long arg3) {   
                        login_publicchannel_trl_sub(arg2);
                    }   
                });
     }

对于有图片的要重写适配器

 代码如下:


package com.nuoter.adapterUntil;

 
 import java.util.HashMap;
 import java.util.List;

 
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Paint;
 import android.net.Uri;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;

 
 public class MySimpleAdapter1 extends BaseAdapter {  
     private LayoutInflater mInflater;  
     private List<HashMap<String, Object>>list;  
     private int layoutID;  
     private String flag[];  
     private int ItemIDs[];  
     public MySimpleAdapter1(Context context,List<HashMap<String, Object>> list,  
             intlayoutID, String flag[], int ItemIDs[]) {  
         this.mInflater =LayoutInflater.from(context);  
         this.list = list;  
         this.layoutID =layoutID;  
         this.flag = flag;  
         this.ItemIDs = ItemIDs;  
     }  
     @Override  
     public int getCount() {  
         // TODO Auto-generated methodstub  
         return list.size();  
     }  
     @Override  
     public Object getItem(int arg0) {  
         // TODO Auto-generated methodstub  
         return 0;  
     }  
     @Override  
     public long getItemId(int arg0) {  
         // TODO Auto-generated methodstub  
         return 0;  
     }  
     @Override  
     public View getView(int position, View convertView,ViewGroup parent) {  
         convertView =mInflater.inflate(layoutID, null);  
        // convertView =mInflater.inflate(layoutID, null);  
         for (int i = 0; i < flag.length;i++) {//
备注1  
             if(convertView.findViewById(ItemIDs[i]) instanceof ImageView) {  
                ImageView imgView = (ImageView) convertView.findViewById(ItemIDs[i]);  
                imgView.setImageBitmap((Bitmap) list.get(position).get(flag[i]));///
关键是这句!!!!!!!!!!!!!!!

             }elseif (convertView.findViewById(ItemIDs[i]) instanceof TextView) {  
                TextView tv = (TextView) convertView.findViewById(ItemIDs[i]);  
                tv.setText((String) list.get(position).get(flag[i]));  
             }else{
                //...备注2 
            }  
         }  
         //addListener(convertView); 
         return convertView;  
     }  

 /*    public void addListener(final View convertView) {

         ImageView imgView =(ImageView)convertView.findViewById(R.id.lxs_item_image);

         

     } */

 }

对于图片的获取,json解析出来的是字符串url:"logoLunbo":http://www.nuoter.com/wtserver/resources/upload/13509015004480.jpg从url获取 图片

ImageService工具类

代码如下:


package com.nuoter.adapterUntil;

 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;

 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;

 
 public class ImageService {

     /**
      *
获取网络图片的数据
      * @param path
网络图片路径
      * @return
      */
     public static Bitmap getImage(String path) throwsException{

         /*URL url = newURL(imageUrl);   
         HttpURLConnection conn =(HttpURLConnection) url.openConnection();   
         InputStream is =conn.getInputStream();   
         mBitmap =BitmapFactory.decodeStream(is);*/
         Bitmap bitmap= null;
         URL url = new URL(path);
         HttpURLConnection conn =(HttpURLConnection) url.openConnection();//基于HTTP协议连接对象
         conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
         if(conn.getResponseCode() ==200){
            InputStream inStream = conn.getInputStream();
             bitmap= BitmapFactory.decodeStream(inStream);
         }
         return bitmap;
     }

     /**
      * 读取流中的数据 从url获取json数据
      * @param inStream
      * @return
      * @throws Exception
      */
     public static byte[] read(InputStream inStream) throwsException{
         ByteArrayOutputStreamoutStream = new ByteArrayOutputStream();
         byte[] buffer = newbyte[1024];
         int len = 0;
         while( (len =inStream.read(buffer)) != -1){
            outStream.write(buffer, 0, len);
         }
         inStream.close();
         returnoutStream.toByteArray();
     }
  }

上面也将从url处获取网络数据写在了工具类ImageService中方面调用,因为都是一样的。

当然也可以在Activity类中写一个获取服务器图片的函数(当用处不多时)

 代码如下:


/*

      *
从服务器取图片
      *
参数:String类型
      * 返回:Bitmap类型

      */

     public static Bitmap getHttpBitmap(String urlpath) {
         Bitmap bitmap = null;
         try {
             //生成一个URL对象
             URLurl = new URL(urlpath);
             //打开连接
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
 //           conn.setConnectTimeout(6*1000);
 //           conn.setDoInput(true);
            conn.connect();
             //得到数据流
            InputStream inputstream = conn.getInputStream();
             bitmap= BitmapFactory.decodeStream(inputstream);
             //关闭输入流
            inputstream.close();
             //关闭连接
            conn.disconnect();
         } catch (Exception e) {
            Log.i("MyTag", "error:"+e.toString());
         }
         return bitmap;
     }

调用:

 代码如下:


public ImageView pic;
 .....
 .....
 allData=Analysis(readParse(url));
 Iterator<HashMap<String, Object>> it=allData.iterator();
 while(it.hasNext()){
 Map<String, Object> ma=it.next();
 if((Integer)ma.get("id")==id)
 {
 logo=(String) ma.get("logo");
 bigpic=getHttpBitmap(logo);
 }
 }
 pic.setImageBitmap(bigpic);

另附 下载数据很慢时建立子线程并传参:

复制代码 代码如下:


new Thread() {
            @Override
             publicvoid run() {
                //
参数列表
                List<NameValuePair> nameValuePairs = newArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("currPage", Integer
                        .toString(1)));
                nameValuePairs.add(new BasicNameValuePair("pageSize", Integer
                        .toString(5)));
                try {
                    String result = doPost(nameValuePairs,POST_URL);                    
                    Message msg = handler.obtainMessage(1, 1, 1, result);
                    handler.sendMessage(msg);                    //
发送消息
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }
         }.start();

         // 定义Handler对象
         handler = new Handler() {
             publicvoid handleMessage(Message msg) {
                switch (msg.what) {
                case 1:{
                    // 处理UI
                    StringBuffer strbuf = new StringBuffer();
                    List<HashMap<String, Object>> lists = null;
                    try {
                        lists = MainActivity.this
                                .parseJson(msg.obj.toString());
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    List<HashMap<String, Object>> data = newArrayList<HashMap<String,Object>>();
                    for(HashMap<String, Object> news : lists){
                        HashMap<String, Object> item = new HashMap<String, Object>();
                        item.put("id", news.get("id"));
                        item.put("ItemText0", news.get("name"));

                        try {
                            bitmap = ImageService.getImage(news.get("logo").toString());
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        if(bitmap==null){
                            Log.i("bitmap", ""+bitmap);
                            Toast.makeText(MainActivity.this, "图片加载错误",Toast.LENGTH_SHORT)
                            .show();                                        // 显示图片编号
                        }
                        item.put("ItemImage",bitmap);
                        data.add(item);
                    }

                    //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应
                    MySimpleAdapter saImageItems = new MySimpleAdapter(MainActivity.this, data, 
                            R.layout.d_travelagence_item, 
                            new String[] {"ItemImage", "ItemText0","ItemText1"}, 
                            new int[] {R.id.lxs_item_image, R.id.lxs_item_text0, R.id.lxs_item_text1});
                    //添加并且显示
                    gridview.setAdapter(saImageItems);
                }
                    break;
                default:
                    break;
                }                 

             }
         };

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值