zoukankan      html  css  js  c++  java
  • android客户端从服务器端获取json数据并解析的实现代码(重要)

    首先客户端从服务器端获取json数据

    1、利用HttpUrlConnection

    /**
          * 从指定的URL中获取数组
          * @param urlPath
          * @return
          * @throws Exception
          */
         public static String readParse(String urlPath) throws Exception { 
                    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)
                 throws Exception {
             String result = null;
             // 获取HttpClient对象
             HttpClient httpClient = new DefaultHttpClient();
             // 新建HttpPost对象
             HttpPost httpPost = new HttpPost(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)
                 throws JSONException {
             /******************* 解析 ***********************/
             JSONArray jsonArray = null;
             // 初始化list数组对象
             ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
             jsonArray = new JSONArray(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 = new MySimpleAdapter1(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, int arg2,  
                                 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, 
                 int layoutID, 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 method stub 
             return list.size(); 
         } 
         @Override 
         public Object getItem(int arg0) { 
             // TODO Auto-generated method stub 
             return 0; 
         } 
         @Override 
         public long getItemId(int arg0) { 
             // TODO Auto-generated method stub 
             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]));///////////关键是这句!!!!!!!!!!!!!!!
    
                 }else if (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) throws Exception{
    
             /*URL url = new URL(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) throws Exception{
             ByteArrayOutputStream outStream = new ByteArrayOutputStream();
             byte[] buffer = new byte[1024];
             int len = 0;
             while( (len = inStream.read(buffer)) != -1){
                 outStream.write(buffer, 0, len);
             }
             inStream.close();
             return outStream.toByteArray();
         }
      }

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

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

    /*
    
          * 从服务器取图片
          * 参数:String类型
          * 返回:Bitmap类型
    
          */
    
         public static Bitmap getHttpBitmap(String urlpath) {
             Bitmap bitmap = null;
             try {
                 //生成一个URL对象
                 URL url = 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
                 public void run() {
                     // 参数列表
                     List<NameValuePair> nameValuePairs = new ArrayList<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() {
                 public void 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 = new ArrayList<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;
                     }                
    
                 }
             };
  • 相关阅读:
    nginx 服务器重启命令,关闭
    eclipse实现热部署和热启动
    Intellij IDEA 文件修改提示星号
    IntelliJ IDEA 自动编译功能无法使用,On 'update' action:选项里面没有update classes and resources这项
    idea最常使用的快捷键
    centos 切换用户显示bash-4.2$,不显示用户名路径的问题
    汉诺塔
    C语言笔记
    @org.springframework.beans.factory.annotation.Autowired(required=true)
    Error creating bean with name 'xxxx' defined in URL
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4740365.html
Copyright © 2011-2022 走看看