閱讀538 返回首頁    go 小米 go 小米6


Android開發18——獲取網絡資源之json數據

一、項目背景
在Android開發中有一項非常廣泛的應用:Android項目獲取另一個web項目的資源或者返回的數據。

本文獲取web項目返回的JSON數據。Android應用解析JSON比XML性能要好,但有許多項目仍然采用的是XML。

 

 

二、實例代碼

Web項目

/**
 * 新聞業務類
 * 
 * @author 徐越
 * 
 */
public class VideoNewsServiceImpl implements VideoNewsService
{
	public List<VideoNews> readNews()
	{
		List<VideoNews> lst = new ArrayList<VideoNews>();
		lst.add(new VideoNews(1, "喜洋洋", 20));
		lst.add(new VideoNews(2, "變形金剛", 10));
		lst.add(new VideoNews(3, "功夫熊貓", 20));
		return lst;
	}
}

/**
 * 新聞Servlet
 * 
 * @author 徐越
 * 
 */
public class ListServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	private VideoNewsService vs = new VideoNewsServiceImpl();

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		List<VideoNews> news = vs.readNews();
		JSONArray jsonarr = JSONArray.fromObject(news);
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/plain;charset=UTF-8");
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		response.getWriter().print(jsonarr);
	}
}


Android項目

public class VideoNewsServiceImpl implements VideoNewsService
{

	/**
	 * 獲取最新視頻資訊,從JSON文件中,解析效率高
	 * 
	 * @return
	 * @throws Exception
	 */
	public List<VideoNews> getNewsFromJson() throws Exception
	{
		List<VideoNews> lst = new ArrayList<VideoNews>();
		String path = "https://xxx.xxx.xxx.xxx:8080/web/ListServlet";
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setReadTimeout(5000);
		conn.setRequestMethod("GET");
		if (200 == conn.getResponseCode())
		{
			InputStream instream = conn.getInputStream();
			lst = parseJSON(instream);
		}
		return lst;
	}

	/**
	 * 解析JSON
	 */
	private List<VideoNews> parseJSON(InputStream instream) throws Exception
	{
		List<VideoNews> lst = new ArrayList<VideoNews>();
		byte[] data = IOUtils.read(instream);
		String jsonStr = new String(data);
		JSONArray array = new JSONArray(jsonStr);
		for (int i = 0; i < array.length(); i++)
		{
			JSONObject jsonObj = (JSONObject) array.getJSONObject(i);
			VideoNews v = new VideoNews(jsonObj.getInt("id"), 
					jsonObj.getString("title"), jsonObj.getInt("timeLength"));
			lst.add(v);
		}
		return lst;
	}
}

/**
 * IO操作工具類
 * 
 * @author 徐越
 * 
 */
public class IOUtils
{
	/**
	 * 讀取輸入流為byte[]數組
	 */
	public static byte[] read(InputStream instream) throws IOException
	{
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = instream.read(buffer)) != -1)
		{
			bos.write(buffer, 0, len);
		}
		return bos.toByteArray();
	}
}

需要指出的是

在web項目中我采用的是net.sf.json下的類對JSON進行解析,而Android項目中默認自帶的JSON包是org.json。API有所不同,隻要熟悉一下即可。

 

最後更新:2017-04-03 05:40:20

  上一篇:go 去除inline-block元素間間距的N種方法
  下一篇:go hql基本查詢語句