java获取网络json数据_Android网络编程之获取网络上的Json数据实例

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

一、创建服务器端:

服务器端项目结构:

c0f7fc7df30380a914b2ec2b2c0e8eec.png

服务器端运行效果图:

53e6cce8c4248c3cf462b6e2191a1417.png

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

package com.jph.sj.model;

import java.util.Date;

/**

* 新闻实体类

* @author jph

* Date:2014.09.26

*/

public class News {

private Integer id;

private String title;

private Date publishDate;

public News(Integer id, String title, Date publishDate) {

this.id = id;

this.title = title;

this.publishDate = publishDate;

}

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 Date getPublishDate() {

return publishDate;

}

public void setPublishDate(Date publishDate) {

this.publishDate = publishDate;

}

}

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

业务接口:

package com.jph.sj.service;

import java.util.List;

import com.jph.sj.model.News;

public interface NewsService {

/**

* 获取最新的资讯

* @return

*/

public List getLastNews();

}

业务接口的实现类:

package com.jph.sj.service.impl;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import com.jph.sj.model.News;

import com.jph.sj.service.NewsService;

public class NewsServiceBean implements NewsService {

/**

* 获取最新的视频资讯

* @return

*/

public List getLastNews(){

List newes = new ArrayList();

newes.add(new News(1, "李白", new Date(System.currentTimeMillis())));

newes.add(new News(2, "杜甫", new Date(System.currentTimeMillis()+8200)));

newes.add(new News(3, "贾宝玉",new Date(System.currentTimeMillis()-6000)));

return newes;

}

}

第三步:创建控制器Servlet

package com.jph.sj.servlet;

import java.io.IOException;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.jph.sj.model.News;

import com.jph.sj.service.NewsService;

import com.jph.sj.service.impl.NewsServiceBean;

/**

* 负责响应客户端的请求:http://xxx/NewsListServlet/NewsListServlet

*/

public class NewsListServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private NewsService newsService = new NewsServiceBean();

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

doPost(request, response);

}

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

List newes = newsService.getLastNews();//获取最新的视频资讯

//[{id:20,title:"xxx",timelength:90},{id:10,title:"xbx",timelength:20}]

StringBuilder sbJson = new StringBuilder();

//将list集合封装成Json格式的字符串

sbJson.append('[');

for(News news : newes){

sbJson.append('{');

sbJson.append("id:").append(news.getId()).append(",");

sbJson.append("title:\"").append(news.getTitle()).append("\",");

sbJson.append("publishDate:").append(news.getPublishDate().getTime());

sbJson.append("},");

}

sbJson.deleteCharAt(sbJson.length() - 1);//删除字符串末尾的逗号

sbJson.append(']');

request.setAttribute("json", sbJson.toString());

request.getRequestDispatcher("/WEB-INF/page/jsonnewslist.jsp").forward(request, response);

}

}

第四步:创建jsonnewslist.jsp页面

${json}

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

二、创建Android端:

Android端项目结构:

8444f6e4e883b518c952acc143433fad.png

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

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

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

核心代码:GetAndParseJson:

package com.jph.gj.service;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import com.jph.model.News;

import android.os.Handler;

import android.os.Message;

/**

* 获取并解析网络上的Json

* @author jph

* Date:2014.09.26

*/

public class GetAndParseJson {

private String url="http://10.219.61.117:8080/ServerForJSON/NewsListServlet";

public static final int PARSESUCCWSS=0x2001;

private Handler handler;

public GetAndParseJson(Handler handler) {

// TODO Auto-generated constructor stub

this.handler=handler;

}

/**

* 获取网络上的XML

*/

public void getJsonFromInternet () {

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

try {

HttpURLConnection conn=(HttpURLConnection) new URL(url).openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

if (conn.getResponseCode()==200) {

InputStream inputStream=conn.getInputStream();

ListlistNews=parseJson(inputStream);

if (listNews.size()>0) {

Message msg=new Message();

msg.what=PARSESUCCWSS;//通知UI线程Json解析完成

msg.obj=listNews;//将解析出的数据传递给UI线程

handler.sendMessage(msg);

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}).start();

}

/**

* 解析json格式的输入流转换成List

* @param inputStream

* @return List

*/

protected List parseJson(InputStream inputStream) {

// TODO Auto-generated method stub

ListlistNews=new ArrayList();

byte[]jsonBytes=convertIsToByteArray(inputStream);

String json=new String(jsonBytes);

try {

JSONArray jsonArray=new JSONArray(json);

for (int i = 0; i < jsonArray.length(); i++) {

JSONObject jObject=jsonArray.getJSONObject(i);

int id=jObject.getInt("id");

String title=jObject.getString("title");

long time=jObject.getLong("publishDate");

News news=new News(id, title, new Date(time));

listNews.add(news);

}

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return listNews;

}

/**

* 将输入流转化成ByteArray

* @param inputStream

* @return ByteArray

*/

private byte[] convertIsToByteArray(InputStream inputStream) {

// TODO Auto-generated method stub

ByteArrayOutputStream baos=new ByteArrayOutputStream();

byte buffer[]=new byte[1024];

int length=0;

try {

while ((length=inputStream.read(buffer))!=-1) {

baos.write(buffer, 0, length);

}

inputStream.close();

baos.flush();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return baos.toByteArray();

}

}

第三步:创建Activity

package com.jph.gj.activity;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import com.jph.gj.R;

import com.jph.gj.service.GetAndParseJson;

import com.jph.model.News;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.app.Activity;

import android.widget.ListView;

import android.widget.SimpleAdapter;

/**

* 获取网络上的Json

* @author jph

* Date:2014.09.26

*/

public class MainActivity extends Activity {

private ListlistNews;

private ListView list;

Handler mHandler=new Handler(){

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

switch (msg.what) {

case GetAndParseJson.PARSESUCCWSS:

listNews=(List) msg.obj;

initData();

break;

}

super.handleMessage(msg);

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

list=(ListView)findViewById(R.id.list);

GetAndParseJson getAndParseJson=new GetAndParseJson(mHandler);

getAndParseJson.getJsonFromInternet();

}

/**

* 将解析后的xml填充到ListView

*/

protected void initData() {

// TODO Auto-generated method stub

List>items=new ArrayList>();

for (News news:listNews) {

Mapitem=new HashMap();

item.put("id", news.getId());

item.put("title", news.getTitle());

item.put("time", convertDate(news.getPublishDate()));

items.add(item);

}

SimpleAdapter adapter=new SimpleAdapter(this, items, R.layout.line, new String[]

{"id","title","time"}, new int[]{R.id.tvId,R.id.tvTitle,R.id.tvTime});

list.setAdapter(adapter);

}

private String convertDate(Date publishDate) {

// TODO Auto-generated method stub

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");

return sdf.format(publishDate);

}

}

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

Android运行效果图:

455248e60ee107c2df57225d1a95647e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值