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(); } } }