json和xml 两者流程相似,只不过数据格式不同
web端
Servlet
package com.lin.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.lin.pojo.News;
import com.lin.service.impl.VideoNewsService;
import com.lin.service.impl.VideoNewsServiceBean;
public class ListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private VideoNewsService service=new VideoNewsServiceBean();
public ListServlet() {
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<News> videos=service.getLastNews();
String format=request.getParameter("format");
if("json".equals(format)){
System.out.println("dadawdfafghrh "+format);
StringBuilder builder=new StringBuilder();
builder.append('[');
for(News news:videos){
builder.append('{');
builder.append("id:").append(news.getId()).append(',');
builder.append("title:\"").append(news.getTitle()).append("\",");
builder.append("timelength:\"").append(news.getTimelength()).append("\"");
builder.append("},");
}
builder.deleteCharAt(builder.length()-1);
builder.append(']');
request.setAttribute("json", builder.toString());
request.getRequestDispatcher("/WEB-INF/page/jsonvideoNews.jsp").forward(request, response);
}
}
}
}
jsp
<%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%>${json}
可以发现,在服务器端json格式的构建更多的是在Servlet里实现的,因为涉及了很多字符串的操作。而xml格式的构建可以在jsp里轻松的完成。
android端
public static List<News> getJSONLastNews() {
String path="http://192.168.189.1:8080/videonews/ListServlet?format=json";
try{
URL url=new URL(path);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode()==200){
InputStream inStream=conn.getInputStream();
return parseJSON(inStream);
}
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/*
* json的解析有java自带的解析器
*/
public static List<News> parseJSON(InputStream inStream) throws Exception{
List<News> newses=new ArrayList<News>();
byte[] data=StreamTools.read(inStream);
String json=new String(data);//chi构造器默认为utf
JSONArray array=new JSONArray(json);//json数组
for(int i=0;i<array.length();i++){
JSONObject object= array.getJSONObject(i);
News news=new News(object.getInt("id"),
object.getString("title"),
object.getString("timelength"));
newses.add(news);
}
return newses;
}
可以看到json解析时,在构造器里传入了一个字符串。
引入了工具包的一个方法,把流以字节的方式存到数组里。得到字符串。然后在对JSONArray解析。这是和xml解析的不同。
而xml解析是直接对流进行处理的
package com.lin.utils;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
public class StreamTools {
/*
* 读取流中的数据
*
* */
public static byte[] read(InputStream inStream) throws Exception{
byte[] buffer=new byte[1024];
ByteArrayOutputStream stream=new ByteArrayOutputStream();
int len=0;
while((len=inStream.read(buffer))!=-1){
stream.write(buffer,0,len);
}
inStream.close();
return stream.toByteArray();
}
}