Android网络编程之获取网络上的Json

请尊重他人的劳动成果,转载请注明出处:Android网络编程之获取网络上的Json

为要获取网络上的Json所以需要服务器端提供的支持。

一、创建服务器端:

服务器端项目结构:

获取网上的Json服务器端项目结构

服务器端运行效果图:

获取网上的Json服务器端运行效果图

第一步:创建业务所需的JavaBean

  1. package com.jph.sj.model;
  2. import java.util.Date;
  3. /**
  4. * 新闻实体类
  5. * @author jph
  6. * Date:2014.09.26
  7. */
  8. public class News {
  9. private Integer id;
  10. private String title;
  11. private Date publishDate;
  12. public News(Integer id, String title, Date publishDate) {
  13. this.id = id;
  14. this.title = title;
  15. this.publishDate = publishDate;
  16. }
  17. public Integer getId() {
  18. return id;
  19. }
  20. public void setId(Integer id) {
  21. this.id = id;
  22. }
  23. public String getTitle() {
  24. return title;
  25. }
  26. public void setTitle(String title) {
  27. this.title = title;
  28. }
  29. public Date getPublishDate() {
  30. return publishDate;
  31. }
  32. public void setPublishDate(Date publishDate) {
  33. this.publishDate = publishDate;
  34. }
  35. }
  36.  

第二步:创建业务逻辑接口和具体实现类

业务接口:

  1. package com.jph.sj.service;
  2. import java.util.List;
  3. import com.jph.sj.model.News;
  4. public interface NewsService {
  5. /**
  6. * 获取最新的资讯
  7. * @return
  8. */
  9. public List<News> getLastNews();
  10. }

业务接口的实现类:

  1. package com.jph.sj.service.impl;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import com.jph.sj.model.News;
  6. import com.jph.sj.service.NewsService;
  7. public class NewsServiceBean implements NewsService {
  8. /**
  9. * 获取最新的视频资讯
  10. * @return
  11. */
  12. public List<News> getLastNews(){
  13. List<News> newes = new ArrayList<News>();
  14. newes.add(new News(1, "李白", new Date(System.currentTimeMillis())));
  15. newes.add(new News(2, "杜甫", new Date(System.currentTimeMillis()+8200)));
  16. newes.add(new News(3, "贾宝玉",new Date(System.currentTimeMillis()-6000)));
  17. return newes;
  18. }
  19. }
  20.  

第三步:创建控制器Servlet

  1. package com.jph.sj.servlet;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import com.jph.sj.model.News;
  9. import com.jph.sj.service.NewsService;
  10. import com.jph.sj.service.impl.NewsServiceBean;
  11. /**
  12. * 负责响应客户端的请求:http://xxx/NewsListServlet/NewsListServlet
  13. */
  14. public class NewsListServlet extends HttpServlet {
  15. private static final long serialVersionUID = 1L;
  16. private NewsService newsService = new NewsServiceBean();
  17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. doPost(request, response);
  19. }
  20. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  21. List<News> newes = newsService.getLastNews();//获取最新的视频资讯
  22. //[{id:20,title:"xxx",timelength:90},{id:10,title:"xbx",timelength:20}]
  23. StringBuilder sbJson = new StringBuilder();
  24. //将list集合封装成Json格式的字符串
  25. sbJson.append('[');
  26. for(News news : newes){
  27. sbJson.append('{');
  28. sbJson.append("id:").append(news.getId()).append(",");
  29. sbJson.append("title:\"").append(news.getTitle()).append("\",");
  30. sbJson.append("publishDate:").append(news.getPublishDate().getTime());
  31. sbJson.append("},");
  32. }
  33. sbJson.deleteCharAt(sbJson.length() - 1);//删除字符串末尾的逗号
  34. sbJson.append(']');
  35. request.setAttribute("json", sbJson.toString());
  36. request.getRequestDispatcher("/WEB-INF/page/jsonnewslist.jsp").forward(request, response);
  37. }
  38. }
  39.  

第四步:创建jsonnewslist.jsp页面

  1. <%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%>
  2. ${json}
  3.  

至此服务器端项目已经完成。下面开始创建Android端项目。

二、创建Android端:

Android端项目结构:

获取网上的Json Android端项目结构

第一步:创建业务所需的JavaBean

提示:因为服务器端和Android端项目都是用Java语言实现的,所以一些组件可以共用,JavaBean便是其中之一。此时我们在搭建Android端项目的时候,完全可以将服务器端项目中JavaBean拿来用。

第二步:创建Android端项目的业务逻辑层

核心代码:GetAndParseJson:

  1. package com.jph.gj.service;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.net.HttpURLConnection;
  6. import java.net.URL;
  7. import java.util.ArrayList;
  8. import java.util.Date;
  9. import java.util.List;
  10. import org.json.JSONArray;
  11. import org.json.JSONException;
  12. import org.json.JSONObject;
  13. import com.jph.model.News;
  14. import android.os.Handler;
  15. import android.os.Message;
  16. /**
  17. * 获取并解析网络上的Json
  18. * @author jph
  19. * Date:2014.09.26
  20. */
  21. public class GetAndParseJson {
  22. private String url="http://10.219.61.117:8080/ServerForJSON/NewsListServlet";
  23. public static final int PARSESUCCWSS=0x2001;
  24. private Handler handler;
  25. public GetAndParseJson(Handler handler) {
  26. // TODO Auto-generated constructor stub
  27. this.handler=handler;
  28. }
  29. /**
  30. * 获取网络上的XML
  31. */
  32. public void getJsonFromInternet () {
  33. new Thread(new Runnable() {
  34. @Override
  35. public void run() {
  36. // TODO Auto-generated method stub
  37. try {
  38. HttpURLConnection conn=(HttpURLConnection) new URL(url).openConnection();
  39. conn.setConnectTimeout(5000);
  40. conn.setRequestMethod("GET");
  41. if (conn.getResponseCode()==200) {
  42. InputStream inputStream=conn.getInputStream();
  43. List<News>listNews=parseJson(inputStream);
  44. if (listNews.size()>0) {
  45. Message msg=new Message();
  46. msg.what=PARSESUCCWSS;//通知UI线程Json解析完成
  47. msg.obj=listNews;//将解析出的数据传递给UI线程
  48. handler.sendMessage(msg);
  49. }
  50. }
  51. } catch (Exception e) {
  52. // TODO Auto-generated catch block
  53. e.printStackTrace();
  54. }
  55. }
  56. }).start();
  57. }
  58. /**
  59. * 解析json格式的输入流转换成List
  60. * @param inputStream
  61. * @return List
  62. */
  63. protected List<News> parseJson(InputStream inputStream) {
  64. // TODO Auto-generated method stub
  65. List<News>listNews=new ArrayList<News>();
  66. byte[]jsonBytes=convertIsToByteArray(inputStream);
  67. String json=new String(jsonBytes);
  68. try {
  69. JSONArray jsonArray=new JSONArray(json);
  70. for (int i = 0; i < jsonArray.length(); i++) {
  71. JSONObject jObject=jsonArray.getJSONObject(i);
  72. int id=jObject.getInt("id");
  73. String title=jObject.getString("title");
  74. long time=jObject.getLong("publishDate");
  75. News news=new News(id, title, new Date(time));
  76. listNews.add(news);
  77. }
  78. } catch (JSONException e) {
  79. // TODO Auto-generated catch block
  80. e.printStackTrace();
  81. }
  82. return listNews;
  83. }
  84. /**
  85. * 将输入流转化成ByteArray
  86. * @param inputStream
  87. * @return ByteArray
  88. */
  89. private byte[] convertIsToByteArray(InputStream inputStream) {
  90. // TODO Auto-generated method stub
  91. ByteArrayOutputStream baos=new ByteArrayOutputStream();
  92. byte buffer[]=new byte[1024];
  93. int length=0;
  94. try {
  95. while ((length=inputStream.read(buffer))!=-1) {
  96. baos.write(buffer, 0, length);
  97. }
  98. inputStream.close();
  99. baos.flush();
  100. } catch (IOException e) {
  101. // TODO Auto-generated catch block
  102. e.printStackTrace();
  103. }
  104. return baos.toByteArray();
  105. }
  106. }
  107.  

第三步:创建Activity

  1. package com.jph.gj.activity;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import com.jph.gj.R;
  9. import com.jph.gj.service.GetAndParseJson;
  10. import com.jph.model.News;
  11. import android.os.Bundle;
  12. import android.os.Handler;
  13. import android.os.Message;
  14. import android.app.Activity;
  15. import android.widget.ListView;
  16. import android.widget.SimpleAdapter;
  17. /**
  18. * 获取网络上的Json
  19. * @author jph
  20. * Date:2014.09.26
  21. */
  22. public class MainActivity extends Activity {
  23. private List<News>listNews;
  24. private ListView list;
  25. Handler mHandler=new Handler(){
  26. @Override
  27. public void handleMessage(Message msg) {
  28. // TODO Auto-generated method stub
  29. switch (msg.what) {
  30. case GetAndParseJson.PARSESUCCWSS:
  31. listNews=(List<News>) msg.obj;
  32. initData();
  33. break;
  34. }
  35. super.handleMessage(msg);
  36. }
  37. };
  38. @Override
  39. protected void onCreate(Bundle savedInstanceState) {
  40. super.onCreate(savedInstanceState);
  41. setContentView(R.layout.activity_main);
  42. list=(ListView)findViewById(R.id.list);
  43. GetAndParseJson getAndParseJson=new GetAndParseJson(mHandler);
  44. getAndParseJson.getJsonFromInternet();
  45. }
  46. /**
  47. * 将解析后的xml填充到ListView
  48. */
  49. protected void initData() {
  50. // TODO Auto-generated method stub
  51. List<Map<String, Object>>items=new ArrayList<Map<String,Object>>();
  52. for (News news:listNews) {
  53. Map<String, Object>item=new HashMap<String, Object>();
  54. item.put("id", news.getId());
  55. item.put("title", news.getTitle());
  56. item.put("time", convertDate(news.getPublishDate()));
  57. items.add(item);
  58. }
  59. SimpleAdapter adapter=new SimpleAdapter(this, items, R.layout.line, new String[]
  60. {"id","title","time"}, new int[]{R.id.tvId,R.id.tvTitle,R.id.tvTime});
  61. list.setAdapter(adapter);
  62. }
  63. private String convertDate(Date publishDate) {
  64. // TODO Auto-generated method stub
  65. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
  66. return sdf.format(publishDate);
  67. }
  68. }
  69.  

至此Android端项目已经完成了。下面就让我们看一下APP运行效果吧:

Android运行效果图:

获取网上的Json Android端运行效果图