android訪問服務器並解析返回的XML和JSON數據

1.模擬服務器

a.新建一個JAVAWEB項目,也就是這裏要充當的服務器,模擬一個業務,並且返回一個XML類型的數據,當然後JSON也行,但是這裏我先使用XML,JSON格式的 後續進行實現。下面圖片是通過訪問服務器返回的XML數據


b.新建一個android項目,訪問服務器,並解析服務器返回的數據

1.新建一個實體類

/**
 * 實體bean,用來將解析後的數據封裝爲對象
 */
public class News {
	private Integer id;
	private String title;
	private Integer timelength;
	public News(){
		
	}
	public News(Integer id, String title, Integer timelength) {
		this.id = id;
		this.title = title;
		this.timelength = timelength;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public Integer getTimelength() {
		return timelength;
	}
	public void setTimelength(Integer timelength) {
		this.timelength = timelength;
	}
}
2.訪問服務器地址,解析數據

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

import cn.kafei.bean.News;

public class NewsService {
    /**
     * 獲取最新視頻資訊
     */
    public static List<News> getListNews() throws Exception {
        // 服務器地址URL,在操作系統上測試訪問項目時使用localhost(127.0.0.1)進行訪問,但在這裏需要將localhost(127.0.0.1)替換爲
        // 本機在局域網或者外網中的IP地址。因爲android和WEB項目運行在不同的平臺上
        String path = "http://192.168.1.109:8080/ListServlet";
        URL url = new URL(path);// 構建一個URL對象
        HttpURLConnection con = (HttpURLConnection) url.openConnection();// 打開連接
        con.setConnectTimeout(5000);// 設置超時時間
        con.setRequestMethod("GET");// 設置請求方式
        if (con.getResponseCode() == 200) {// 判斷是否請求成功,狀態碼爲200
            InputStream inStream = con.getInputStream();
            return parseXML(inStream);
        }
        return null;
    }

    /**
     * 解析服務器返回的XML數據
     * 
     * @param inStream
     */
    private static List<News> parseXML(InputStream inStream) throws Exception {
        List<News> newList = new ArrayList<News>();
        News news = null;
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(inStream, "UTF-8");
        int event = parser.getEventType();
        while (event != XmlPullParser.END_DOCUMENT) {
            switch (event) {
            case XmlPullParser.START_TAG:
                if ("news".equals(parser.getName())) {
                    int id = new Integer(parser.getAttributeValue(0));
                    news = new News();
                    news.setId(id);
                } else if ("title".equals(parser.getName())) {
                    news.setTitle(parser.nextText());
                } else if ("timelength".equals(parser.getName())) {
                    news.setTimelength(new Integer(parser.nextText()));
                }
                break;
            case XmlPullParser.END_TAG:
                if ("news".equals(parser.getName())) {
                    newList.add(news);
                    news = null;
                }
                break;
            }
            event = parser.next();
        }
        return newList;
    }
}
3.將數據顯示在ListView中,至於ListView顯示數據這裏不在進行介紹,請訪問我之前發表的博文ListView綁定數據

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

import cn.kafei.bean.News;
import cn.kafei.service.NewsService;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class NewsActivity extends Activity {
	private ListView listView = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		listView = (ListView) this.findViewById(R.id.listView);// listView顯示控件
		try {
			List<News> news = NewsService.getListNews();// 獲取服務器請求返回的數據信息
			List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
			for (News n : news) {
				HashMap<String, Object> item = new HashMap<String, Object>();
				item.put("id", n.getId());
				item.put("title", n.getTitle());
				item.put(
						"timelength",
						getResources().getString(R.string.timeLength)
								+ n.getTimelength()
								+ getResources().getString(R.string.min));
				data.add(item);
			}
			SimpleAdapter adapter = new SimpleAdapter(this, data,
					R.layout.item, new String[] { "title", "timelength" },
					new int[] { R.id.title, R.id.timelength });
			listView.setAdapter(adapter);// 將SimpleAdapter適配器將數據綁定在ListView上
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4.解析JSON的方法

/**
	 * 獲取服務器端JSON格式數據
	 */
	public static List<News> getListNewsJson() throws Exception {
		// 服務器地址URL,在操作系統上測試訪問項目時使用localhost(127.0.0.1)進行訪問,但在這裏需要將localhost(127.0.0.1)替換爲
		// 本機在局域網或者外網中的IP地址。因爲android和WEB項目運行在不同的平臺上
		String path = "http://192.168.1.109:8080/ListServlet?format=json";
		URL url = new URL(path);// 構建一個URL對象
		HttpURLConnection con = (HttpURLConnection) url.openConnection();// 打開連接
		con.setConnectTimeout(5000);// 設置超時時間
		con.setRequestMethod("GET");// 設置請求方式
		if (con.getResponseCode() == 200) {// 判斷是否請求成功,狀態碼爲200
			InputStream inStream = con.getInputStream();
			return parseJSON(inStream);
		}
		return null;
	}

	/**
	 * 解析JSON數據
	 * @param inStream
	 * @return
	 * @throws IOException 
	 */
	private static List<News> parseJSON(InputStream inStream) throws Exception {
		List<News> newsList=new ArrayList<News>();
		byte[] data=read(inStream);
		String json=new String(data);
		JSONArray array=new JSONArray(json);
		for (int i=0;i<array.length();i++) {
			JSONObject jsonObject=array.getJSONObject(i);
			News news=new News(jsonObject.getInt("id"), jsonObject.getString("title"), jsonObject.getInt("timelength"));
			newsList.add(news);
		}
		return newsList;
	}

	/**
	 * 讀取流中的數據
	 */
	public static byte[] read(InputStream inputStream) throws IOException {
		ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
		byte[] b=new byte[1024];
		int len=0;
		while((len=inputStream.read(b))!=-1){
			outputStream.write(b);
		}
		inputStream.close();
		return outputStream.toByteArray();
	}
服務端組件JSON字符串:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<News> news=service.getListNews();
		String format=request.getParameter("format");
		if("json".equals(format)){
			StringBuilder builder=new StringBuilder();
			builder.append('[');
			for(News n:news){
				builder.append('{');
				builder.append("id:").append(n.getId()).append(',');
				builder.append("title:\"").append(n.getTitle()).append("\",");
				builder.append("timelength:").append(n.getTimelength());
				builder.append("},");
			}
			builder.deleteCharAt(builder.length()-1);
			builder.append(']');
			//將新聞放到request對象中
			request.setAttribute("json", builder.toString());
			request.getRequestDispatcher("/WEB-INF/page/newsjson.jsp").forward(request, response);
		}else{
		//將新聞放到request對象中
		request.setAttribute("news", news);
		//用轉發將數據顯示的頁面上
		request.getRequestDispatcher("/WEB-INF/page/news.jsp").forward(request, response);
		}
	}


5.顯示效果


源碼下載地址:android訪問網絡源碼

發佈了50 篇原創文章 · 獲贊 11 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章