Android网络编程之获取网络上的Json数据实例
程序员文章站
2022-04-30 22:55:03
为要获取网络上的json所以需要服务器端提供的支持。
一、创建服务器端:
服务器端项目结构:
服务器端运行效果图:
第一步:创建业务所需的javabean...
为要获取网络上的json所以需要服务器端提供的支持。
一、创建服务器端:
服务器端项目结构:
服务器端运行效果图:
第一步:创建业务所需的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<news> 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<news> getlastnews(){
list<news> newes = new arraylist<news>();
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<news> 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页面
复制代码 代码如下:
<%@ page language="java" contenttype="text/plain; charset=utf-8" pageencoding="utf-8"%>
${json}
至此服务器端项目已经完成。下面开始创建android端项目。
二、创建android端:
android端项目结构:
第一步:创建业务所需的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();
list<news>listnews=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<news> parsejson(inputstream inputstream) {
// todo auto-generated method stub
list<news>listnews=new arraylist<news>();
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 list<news>listnews;
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<news>) 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<map<string, object>>items=new arraylist<map<string,object>>();
for (news news:listnews) {
map<string, object>item=new hashmap<string, object>();
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运行效果图:
上一篇: Android剪贴板用法详解