JSON——JavaScript Object Notation Javascript的对象图,轻量级数据交换格式
Java的JSON解析库——org.json
1、xml与json的表示
xml:
<user>
<username>aaa</username>
<password>bbb</password>
<addr>shganghai</addr>
</user>
<user>
<username>ccc</username>
<password>ddd</password>
<addr>beijing</addr>
</user>
JSON:
[{username:"aaa",password:"bbb",addr:"shanghai"},{username:"ccc",password:"ddd",addr:"beijing"}]
2、JSON的MIME :application/json
3、使用google-json将对象转换为json数据:
import java.util.ArrayList;
import java.util.List;
public class Person
{
private String username;
private String password;
private String addr;
private Number age;
private List<String> list = new ArrayList<String>();
public String getUsername()
{
return username;
}
public List<String> getList()
{
return list;
}
public void setList(List<String> list)
{
this.list = list;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getAddr()
{
return addr;
}
public void setAddr(String addr)
{
this.addr = addr;
}
public Number getAge()
{
return age;
}
public void setAge(Number age)
{
this.age = age;
}
}
import com.google.gson.Gson;
public class Test
{
public static void main(String[] args)
{
Person person = new Person();
person.setUsername("zhangsan");
person.setPassword("123456");
person.setAddr("shanghai");
person.setAge(30);
person.getList().add("hello");
person.getList().add("world");
person.getList().add("welcom");
Gson gson = new Gson();
String result = gson.toJson(person);
System.out.println(result);
}
}
4、使用jQuery的ajax方法提交
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet
{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
int param1 = Integer.parseInt(req.getParameter("param1"));
int param2 = Integer.parseInt(req.getParameter("param2"));
resp.setHeader("pragma", "no-cache");
resp.setHeader("cache-control", "no-cache");
PrintWriter out = resp.getWriter();
out.println(String.valueOf(param1 + param2));
out.flush();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
this.doPost(req,resp);
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'ajax.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="scripts/jquery-1.9.1.js"></script>
<script type="text/javascript">
$(function()
{
$("#button1").click(function()
{
$.ajax({
type:"GET",
url:"MyServlet",
dateType:"html",
data:{'param1':$("#param1").val(),'param2':$("#param2").val()},
success:function(returnedData){
$("#result").val(returnedData);
}
});
});
});
</script>
</head>
<body>
<input type="text" id="param1">+
<input type="text" id="param2">=
<input type="text" id="result"><input type="button" value="click" id="button1">
</body>
</html>
5、jQuery的ajax与servlet混合使用传递xml
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import com.cdtax.model.Person;
public class XMLServlet extends HttpServlet
{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String name = req.getParameter("name");
Person person = new Person();
if("zhangsan".equals(name))
{
person.setId(1);
person.setName("zhangsan");
person.setAddr("beijing");
person.setAge(30);
}
else
{
person.setId(2);
person.setName("lisi");
person.setAddr("shanghai");
person.setAge(20);
}
Document document = DocumentHelper.createDocument();
Element rootElement = document.addElement("users");
rootElement.addComment("this is comment");
Element userElement = rootElement.addElement("user");
Element idElement = userElement.addElement("id");
Element nameElement = userElement.addElement("name");
Element ageElement = userElement.addElement("age");
Element addrElement = userElement.addElement("addr");
idElement.setText(person.getId() + "");
nameElement.setText(person.getName());
ageElement.setText(person.getAge() + "");
addrElement.setText(person.getAddr());
resp.setContentType("text/xml;charset=utf-8");
resp.setHeader("pragma", "no-cache");
resp.setHeader("cache-control", "no-cache");
PrintWriter out = resp.getWriter();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter xmlWriter = new XMLWriter(out,format);
xmlWriter.write(document);
out.flush();
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'xml.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="scripts/jquery-1.9.1.js"></script>
<script type="text/javascript">
$(function()
{
$("#button1").click(function()
{
$.ajax({
type:"POST",
url:"XMLServlet",
dateType:"xml",
data:{'name': $("#name").val()},
success:function(returnedData){
var id = $(returnedData).find("id").text();
var name = $(returnedData).find("name").text();
var age = $(returnedData).find("age").text();
var addr = $(returnedData).find("addr").text();
var html = "<table width='60%' border='1' align='center'><tr><th>id</th><th>name</th><th>addr</th><th>age</th></tr><tr align='center'><td>" + id + "</td><td>" + name + "</td><td>" + addr + "</td><td>" + age + "</td></tr></table>"
$("#theBody table:eq(0)").remove();
$("#theBody").append(html);
}
});
});
});
</script>
</head>
<body id="theBody">
<select id="name">
<option value="zhangsan">zhangsan</option>
<option value="lisi">lisi</option>
</select>
<input type="button" id="button1" value="click me">
</body>
</html>
使用post方法:
<script type="text/javascript">
$(function()
{
$("#button1").click(function()
{
/*
$.ajax({
type:"POST",
url:"XMLServlet",
dateType:"xml",
data:{'name': $("#name").val()},
success:function(returnedData){
var id = $(returnedData).find("id").text();
var name = $(returnedData).find("name").text();
var age = $(returnedData).find("age").text();
var addr = $(returnedData).find("addr").text();
var html = "<table width='60%' border='1' align='center'><tr><th>id</th><th>name</th><th>addr</th><th>age</th></tr><tr align='center'><td>" + id + "</td><td>" + name + "</td><td>" + addr + "</td><td>" + age + "</td></tr></table>"
$("#theBody table:eq(0)").remove();
$("#theBody").append(html);
}
});
*/
$.post("XMLServlet",
{
name:$("#name").val()
},function(returnedData,status)
{
var id = $(returnedData).find("id").text();
var name = $(returnedData).find("name").text();
var age = $(returnedData).find("age").text();
var addr = $(returnedData).find("addr").text();
var html = "<table width='60%' border='1' align='center'><tr><th>id</th><th>name</th><th>addr</th><th>age</th></tr><tr align='center'><td>" + id + "</td><td>" + name + "</td><td>" + addr + "</td><td>" + age + "</td></tr></table>"
$("#theBody table:eq(0)").remove();
$("#theBody").append(html);
});
});
});
</script>
6、使用json传递数据:
import java.util.List;
public class People
{
private int id;
private String name;
private Address addr;
private List<People> friends;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Address getAddr()
{
return addr;
}
public void setAddr(Address addr)
{
this.addr = addr;
}
public List<People> getFriends()
{
return friends;
}
public void setFriends(List<People> friends)
{
this.friends = friends;
}
}
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
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.cdtax.model.Address;
import com.cdtax.model.People;
import com.google.gson.Gson;
public class GsonServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
List<People> list = new ArrayList<People>();
People people1 = new People();
Address addr1 = new Address();
addr1.setCompanyAddress("beijing");
addr1.setHomeAddress("shangas");
people1.setId(1);
people1.setName("zhangsdasan");
people1.setAddr(addr1);
People people11 = new People();
people11.setId(5);
people11.setName("zhangsan11");
People people12 = new People();
people12.setId(6);
people12.setName("zhangds1111");
List<People> list1 = new ArrayList<People>();
list1.add(people11);
list1.add(people12);
people1.setFriends(list1);
System.out.println("---------");
People people2 = new People();
Address addr2 = new Address();
addr2.setCompanyAddress("shangddd");
addr2.setHomeAddress("befjdsk");
people2.setId(2);
people2.setName("lisi");
people2.setAddr(addr2);
List<People> list2 = new ArrayList<People>();
People people21 = new People();
people21.setId(7);
people21.setName("lisi1111");
People people22 = new People();
people22.setId(8);
people22.setName("lll1111");
list2.add(people21);
list2.add(people22);
people2.setFriends(list2);
list.add(people1);
list.add(people2);
Gson gson = new Gson();
String result = gson.toJson(list);
System.out.println(result);
resp.setContentType("application/json;charset=utf-8");
resp.setHeader("pragma", "no-cache");
resp.setHeader("cache-control", "no-cache");
PrintWriter out = resp.getWriter();
out.println(result);
out.flush();
}
}
打印的json数据为:
[{"id":1,"name":"zhangsdasan","addr":{"homeAddress":"shangas","companyAddress":"beijing"},"friends":[{"id":5,"name":"zhangsan11"},{"id":6,"name":"zhangds1111"}]},{"id":2,"name":"lisi","addr":{"homeAddress":"befjdsk","companyAddress":"shangddd"},"friends":[{"id":7,"name":"lisi1111"},{"id":8,"name":"lll1111"}]}]
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'json.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="scripts/jquery-1.9.1.js"></script>
<script type="text/javascript">
$(function()
{
$("#button1").click(function()
{
$.get("GsonServlet",{},function(returnedData,status)
{
var html = "<table width='60%' border='1' align='center'><tr><th>id</th><th>name</th><th>homeaddr</th><th>compaddr</th></tr>";
alert(returnedData.length);
for(var i = 0; i < returnedData.length;i++)
{
var people = returnedData[i];
var id = people.id;
var name = people.name;
var compAddr = people.addr.companyAddress;
var homeAddr = people.addr.homeAddress;
html += "<tr><td>"+id+"</td><td>" + name +"</td><td>"+ homeAddr + "</td><td>" + compAddr + "</td><tr>";
}
html += "</table>";
$("#theBody table:eq(0)").remove();
$("#theBody").append(html);
});
});
});
</script>
</head>
<body id="theBody">
<input type="button" value="ddfds" id="button1">
</body>
</html>
在firefox中测试通过,在IE中测试失败。在IE中,$.get("GsonServlet",{},function(returnedData,status)的returnedData长度一直是0,在firefox中是2,不知道什么原因
7、google images search APIs,返回的是一个json数据
要使用google的api,需要一个API key,免费获得
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class Test
{
public static void main(String[] args) throws Exception
{
String str = "http://ajax.googleapis.com/ajax/services/search/images?q=macbook&rsz=large&start=0&v=1.0";
URLConnection conn = new URL(str).openConnection();
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringBuffer buffer = new StringBuffer();
String line = null;
while(null != (line = br.readLine()))
{
buffer.append(line);
}
br.close();
isr.close();
is.close();
System.out.println(buffer);
}
}
flickr的图片搜索API
使用两种方式搜索保存图片
google和flickr搜索:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.json.JSONArray;
import org.json.JSONObject;
import com.cdtax.util.Constant;
import com.cdtax.util.NetworkUtil;
import com.google.gson.Gson;
public class GetImageServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try
{
String categoryName = req.getParameter("categoryName");
String picSource = req.getParameter("picSource");
//存储向客户端发送的url
List<String> returnedList = new ArrayList<String>();
HttpSession session = req.getSession();
session.setAttribute("categoryName", categoryName);
session.setAttribute("picSource", picSource);
session.setAttribute("images", returnedList);
if("google".equals(picSource))
{
//存储每次从Google所获取的json数据
List<String> list = new ArrayList<String>();
for(int i = 0; i < 8; i++)
{
String queryString = new StringBuffer(Constant.GOOGLE_URL).append("q=")
.append(categoryName).append("&start=").append(8 * i).toString();
list.add(NetworkUtil.getStringContentFromURL(queryString));
}
for(String result : list)
{
JSONObject jsonContent = new JSONObject(result);
JSONObject responseData = jsonContent.getJSONObject("responseData");
JSONArray results = responseData.getJSONArray("results");
for(int i = 0;i< results.length();i++)
{
JSONObject jsonObject = results.getJSONObject(i);
String url = jsonObject.getString("url");
returnedList.add(url);
}
}
}
//flickr
else
{
String urlString = Constant.FLICKR_URL +"tags=" +categoryName;
String jsonContent = NetworkUtil.getStringContentFromURL(urlString);
//flickr返回的不是一个有效地json数据,需要剔除前面14个字符和最后一个字符,它的形式这样jsonFlickrApi(),括号里是json格式数据
jsonContent = jsonContent.substring(14,jsonContent.length()-1);
JSONObject jsonObject = new JSONObject(jsonContent);
JSONArray jsonArray = jsonObject.getJSONObject("photos").getJSONArray("photo");
for(int i = 0; i < jsonArray.length();i++)
{
JSONObject object = jsonArray.getJSONObject(i);
String id = object.getString("id");
int farmId = object.getInt("farm");
String serverId = object.getString("server");
String secretId = object.getString("secret");
StringBuffer buffer = new StringBuffer();
//http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}.jpg,这是flickr图片的最后地址形式
buffer.append("http://farm").append(farmId).append(".static.flickr.com/")
.append(serverId).append("/").append(id).append("_").append(secretId).append(".jpg");
returnedList.add(buffer.toString());
}
}
Gson gson = new Gson();
String jsonResult = gson.toJson(returnedList);
resp.setContentType("application/json;charset=utf-8");
resp.setHeader("pragma", "no-cache");
resp.setHeader("cache-control", "no-cache");
PrintWriter out = resp.getWriter();
out.println(jsonResult);
out.flush();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="scripts/jquery-1.9.1.js"></script>
<script type="text/javascript">
$(function()
{
$("#button1").click(function()
{
$.get("GetImageServlet",
{
categoryName:$("#categoryName").val(),
picSource:$("input[name=picSource]:checked").val()
},
function(returnedData,status)
{
$("#div1").empty();
var html = "";
for(var i = 0; i < returnedData.length;i++)
{
html += "<img src='" + returnedData[i] + "' width='150' height='150'>"
}
$("#div1").append(html);
});
});
$("#button2").click(function()
{
$.post("SaveImageServlet",{},function()
{
$("#div2").html("<font color='red'>processing</font>");
});
});
});
</script>
</head>
<body>
<input type="text" id="categoryName">
<input type="radio" name="picSource" value="google" checked>Google
<input type="radio" name="picSource" value="flickr" checked>Flickr
<input type="button" value="click" id="button1">
<input type="button" value="save" id="button2" >
<div id="div2"></div>
<div id="div1"></div>
</body>
</html>
保存:没有使用多线程:
import java.io.File;
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 javax.servlet.http.HttpSession;
import com.cdtax.util.NetworkUtil;
public class SaveImageServlet extends HttpServlet
{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try
{
HttpSession session = req.getSession();
String categoryName = (String)session.getAttribute("categoryName");
String picSource = (String)session.getAttribute("picSource");
List<String> list = (List<String>)session.getAttribute("images");
String path = req.getSession().getServletContext().getRealPath("/storeImage");
File directory = new File(path,picSource + "/" + categoryName);
directory.mkdirs();
long startTime = System.currentTimeMillis();
for(String imageUrl : list)
{
int position = imageUrl.lastIndexOf("/");
String imageName = imageUrl.substring(position +1);
File file = new File(directory,imageName);
NetworkUtil.Write2LocalFromInternet(imageUrl, file);
}
long endTime = System.currentTimeMillis();
System.out.println("time elapsed:" + (endTime - startTime));
resp.getWriter().print("sucess");
resp.getWriter().flush();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
使用的辅助工具:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
public class NetworkUtil
{
public static String getStringContentFromURL(String queryString) throws Exception
{
URL url = new URL(queryString);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringBuffer buffer = new StringBuffer();
String line = null;
while(null != (line = br.readLine()))
{
buffer.append(line);
}
br.close();
isr.close();
is.close();
return buffer.toString();
}
public static void Write2LocalFromInternet(String imageUrl,File file) throws Exception
{
InputStream is = null;
OutputStream os = null;
try
{
URL url = new URL(imageUrl);
is = url.openStream();
os = new FileOutputStream(file);
int length = -1;
byte[] buffer = new byte[7092];
while(-1 != (length = is.read(buffer,0,7092)))
{
os.write(buffer,0,length);
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(null !=is)
{
is.close();
}
if(null !=os)
{
os.close();
}
}
}
}
使用多线程的方式保存:
import java.io.File;
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 javax.servlet.http.HttpSession;
import com.cdtax.util.NetworkUtil;
import com.cdtax.util.SaveImageThread;
public class SaveImageServlet extends HttpServlet
{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try
{
HttpSession session = req.getSession();
String categoryName = (String)session.getAttribute("categoryName");
String picSource = (String)session.getAttribute("picSource");
List<String> list = (List<String>)session.getAttribute("images");
String path = req.getSession().getServletContext().getRealPath("/storeImage");
File directory = new File(path,picSource + "/" + categoryName);
directory.mkdirs();
//long startTime = System.currentTimeMillis();
String[] array = null;
for(int i = 0; i < list.size(); i++)
{
String imageUrl = list.get(i);
int position = imageUrl.lastIndexOf("/");
String imageName = imageUrl.substring(position +1);
File file = new File(directory,imageName);
if(i % 4 ==0)
{
if(0 != i)
{
new SaveImageThread(directory,array).start();
}
array = new String[4];
}
array[i % 4] = imageUrl;
}
//long endTime = System.currentTimeMillis();
//System.out.println("time elapsed:" + (endTime - startTime));
resp.getWriter().print("sucess");
resp.getWriter().flush();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
使用的线程辅助类:
import java.io.File;
public class SaveImageThread extends Thread
{
private File directory;
private String[] imageUrls;
public SaveImageThread(File directory,String[] imageUrls)
{
this.directory = directory;
this.imageUrls = imageUrls;
}
@Override
public void run()
{
try
{
for(String imageUrl : imageUrls)
{
int position = imageUrl.lastIndexOf("/");
String imageName = imageUrl.substring(position,+1);
File file = new File(directory,imageName);
NetworkUtil.Write2LocalFromInternet(imageUrl, file);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}