json数据解析

来源:互联网 发布:gsp认证软件 编辑:程序博客网 时间:2024/06/14 23:58
首先客户端从服务器端获取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;

                 }                

 

             }

         };

 http://url.cn/RTBgdY详细说明

0 0
原创粉丝点击