你的位置:首页 > 操作系统

[操作系统]android客户端从服务器端获取json数据并解析的实现代码


今天总结一下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的             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;         }               }     };