JSON实际就是一种数据格式,传递数据,特别的地方在于:JSON的数据格式可以直接构成JavaScript中的一个对象,因些可以在JavaScript很易容访问到它的数据。(个人的见解,关于JSON的其它资料可以去google一下)
下面就应用一下JSON:
使用JSON需要一些文件:将js对象转化成JSON的数据格式的JS如:json.js
将Java对象转化成JSON的数据格式的jar包:json-lib-2.3-jdk15.jar等可以在下面的附件中获得
我在我的工程中引入了这个文件(也可以不用这个文件,那么你需要自己在js或class中拼成JSON格式的数据)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSON学习</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">
<script type="text/javascript" src="js/json.js"></script>
</head>
<script language="javascript">
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function doJSON(){
var car = getCarObject();
//将JS对象转化成JSON格式的Text
var carAsJSON = JSON.stringify(car);
alert(carAsJSON);
var url = "JsonTest1?timeStamp="+new Date().getTime();
createXMLHttpRequest();
xmlHttp.open("POST", url, true);
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(carAsJSON);
}
//Ajax的回调方法
function handleStateChange(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
parseResults();
}
}
}
//具体的回调作动
function parseResults(){
var responseDiv = document.getElementById("serverResponse");
if(responseDiv.hasChildNodes()){
responseDiv.removeChild(responseDiv.childNodes[0]);
}
//xmlHttp.responseText是servlet中返回回来的JSON格式的数据,将它创建成一个js的node对象放到DIV中
var responseText = document.createTextNode(xmlHttp.responseText);
responseDiv.appendChild(responseText);
//将json格式的Text转化成JSON对象:用eval('('+response+')')
var resultJson = eval('('+xmlHttp.responseText+')');
alert(resultJson);
alert(resultJson.make);
alert(resultJson.model);
alert(resultJson.year);
alert(resultJson.color);
}
//JS中的一个对象
function Car(make,model,year,color){
this.make = make;
this.model = model;
this.year = year;
this.color = color;
}
//构成对象并返回
function getCarObject(){
return new Car("Dodge", "Coronet R/T", 1968, "yellow");
}
</script>
<body>
<form action="#">
<input type="button" value="Click here to send JSON data to the server" onclick="doJSON();"/>
</form>
<h2>Server Response:</h2>
<div id="serverResponse">
</div>
</body>
</html>
在我的servlet中实现如下:
public class JsonTest1 extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 306348969081510518L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String json = readJSONStringFromRequestBody(request);
System.out.println("json = " + json);
//将request中接收的字符串转化成json对java对象
JSONObject jsonObject = JSONObject.fromObject(json);
System.out.println("jsonObject = " + jsonObject.toString());
System.out.println(jsonObject.getInt("year"));
System.out.println(jsonObject.getString("make"));
System.out.println(jsonObject.getString("model"));
System.out.println(jsonObject.getString("color"));
//设置返回的格式是text
response.setContentType("text/plain");
response.getWriter().print(jsonObject);
}
private String readJSONStringFromRequestBody(HttpServletRequest request) {
StringBuffer json = new StringBuffer();
String line = null;
try {
BufferedReader bufferRead = request.getReader();
while ((line = bufferRead.readLine()) != null) {
System.out.println("line = " + line);
json.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return json.toString();
}
}
servlet的配置如下:
<servlet> <servlet-name>JsonTest1</servlet-name> <servlet-class>com.mengya.servlet.JsonTest1</servlet-class> </servlet> <servlet-mapping> <servlet-name>JsonTest1</servlet-name> <url-pattern>/JsonTest1</url-pattern> </servlet-mapping>
相于java对象与json之类的转化的一些测试如下(跟上面的实例无关):
public class JsonBean1 {
private String col;
private String row;
private String value;
public String getCol() {
return col;
}
public void setCol(String col) {
this.col = col;
}
public String getRow() {
return row;
}
public void setRow(String row) {
this.row = row;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
/**
*
* @author 张明学
*
*/
public class JsonBanTest {
/**
* @param args
*/
public static void main(String[] args) {
boolean[] boolArray = new boolean[] { true, false, true };
JSONArray jsonArray1 = JSONArray.fromObject(boolArray);
System.out.println(jsonArray1);
List list = new ArrayList();
list.add("first");
list.add("second");
JSONArray jsonArray2 = JSONArray.fromObject(list);
System.out.println(jsonArray2);
JSONArray jsonArray3 = JSONArray.fromObject("['json','is','easy']");
System.out.println(jsonArray3);
Map map = new HashedMap();
map.put("name", "json");
map.put("bool", Boolean.TRUE);
map.put("int", new Integer(1));
map.put("arr", new String[] { "a", "b" });
map.put("func", "function(i){return this.arr[i]}");
JSONObject json = JSONObject.fromObject(map);
System.out.println(json);
JsonBean1 jb = new JsonBean1();
jb.setCol("col1");
jb.setRow("row1");
jb.setValue("123");
JSONObject ja = JSONObject.fromObject(jb);
System.out.println(ja.toString());
List list2 = new ArrayList();
JsonBean1 jb2 = new JsonBean1();
jb2.setCol("col1");
jb2.setRow("row1");
jb2.setValue("123");
list2.add(jb);
list2.add(jb2);
JSONArray jsonArray = JSONArray.fromObject(list2);
System.out.println(jsonArray.toString());
String jsonStr = "{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}";
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
System.out.println(jsonObject);
System.out.println(jsonObject.get("name"));
System.out.println(jsonObject.get("bool"));
System.out.println(jsonObject.get("int"));
System.out.println(jsonObject.get("double"));
System.out.println(jsonObject.get("func"));
System.out.println(jsonObject.get("array"));
}
}