在
JSON
中我们已经介绍过其基本格式,与
XML
相同,
JSON
只是一个文字格式,只要客户端与伺服端可以剖析它,就可以利用它作为传送数据的格式,但它是
JavaScript
的核心特性之一,所以在
JavaScript
中使用
JSON
作为资料格式很方便,您还可以在
http://www.json.org
找到处理
JSON
的链接库,包括客户端
JavaScript library
与伺服端的
library
。
相较于 XML , JSON 在资料表示时更为简洁,例如一个表示账户的资料, XML 中可能如下表示:
相较于 XML , JSON 在资料表示时更为简洁,例如一个表示账户的资料, XML 中可能如下表示:
<account>
<number>123456</number>
<name>Justin</name>
<balance>1000</balance>
</account>
<number>123456</number>
<name>Justin</name>
<balance>1000</balance>
</account>
而使用 JSON 可以这么表示:
var account = {
number : "123456",
name: "Justin",
balance: "1000"
};
number : "123456",
name: "Justin",
balance: "1000"
};
<script type="text/javascript" src="json.js"></script>
json.js 中有 JSON parser 与 JSON stringifier ,例如它扩充了对象,增加了 toJSONString() 函式,您可以直接如下传回对象的 JSON 表示法:
function Account(number, name, balance) {
this.number = number;
this.name = name;
this.balance = balance;
}
var account = new Account(123456, "Justin", 1000);
alert(account.toJSONString());
this.number = number;
this.name = name;
this.balance = balance;
}
var account = new Account(123456, "Justin", 1000);
alert(account.toJSONString());
- HandleJSONEx-2.js
var xmlHttp;
function createXMLHttpRequest() {
if(window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
function prepareJSON() {
var number = document.getElementById("num").value;
var name = document.getElementById("name").value;
var balance = document.getElementById("bal").value;
var account = new Object();
account.number = number;
account.name = name;
account.balance = balance;
return account.toJSONString();
}
function handleAccount() {
var json = prepareJSON();
var url = "JSONServlet?timeStamp" + new Date().getTime();
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("POST", url);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(json);
}
function handleStateChange() {
if(xmlHttp.readyState == 4) {
if(xmlHttp.status == 200) {
document.getElementById("response").innerHTML = xmlHttp.responseText;
}
}
}
function createXMLHttpRequest() {
if(window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
function prepareJSON() {
var number = document.getElementById("num").value;
var name = document.getElementById("name").value;
var balance = document.getElementById("bal").value;
var account = new Object();
account.number = number;
account.name = name;
account.balance = balance;
return account.toJSONString();
}
function handleAccount() {
var json = prepareJSON();
var url = "JSONServlet?timeStamp" + new Date().getTime();
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("POST", url);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(json);
}
function handleStateChange() {
if(xmlHttp.readyState == 4) {
if(xmlHttp.status == 200) {
document.getElementById("response").innerHTML = xmlHttp.responseText;
}
}
}
这个程序使用者输入的账号信息包装为对象,并使用 JSON 扩充的 toJSONString() 将之转换为 JSON 格式,之后 POST 至伺服端,伺服端可以至 JSON in Java 下载 JSON 伺服端的 Parser ,您可以撰写以下的程序:
- JSONServlet.java
package onlyfun.caterpillar;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.*;
public class JSONServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
public JSONServlet() {
super();
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String json = readJSONString(request);
JSONObject jsonObject = null;
String responseText = null;
try {
jsonObject = new JSONObject(json);
responseText = " 账号 " + jsonObject.getString("number") + "<br/> 名称 "
+ jsonObject.getString("name") + "<br/> 余额 " + jsonObject.getString("balance");
}
catch (JSONException e) {
e.printStackTrace();
}
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml");
response.getWriter().print(responseText);
}
private String readJSONString(HttpServletRequest request){
StringBuffer json = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while((line = reader.readLine()) != null) {
json.append(line);
}
}
catch(Exception e) {
System.out.println(e.toString());
}
return json.toString();
}
}
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.*;
public class JSONServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
public JSONServlet() {
super();
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String json = readJSONString(request);
JSONObject jsonObject = null;
String responseText = null;
try {
jsonObject = new JSONObject(json);
responseText = " 账号 " + jsonObject.getString("number") + "<br/> 名称 "
+ jsonObject.getString("name") + "<br/> 余额 " + jsonObject.getString("balance");
}
catch (JSONException e) {
e.printStackTrace();
}
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml");
response.getWriter().print(responseText);
}
private String readJSONString(HttpServletRequest request){
StringBuffer json = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while((line = reader.readLine()) != null) {
json.append(line);
}
}
catch(Exception e) {
System.out.println(e.toString());
}
return json.toString();
}
}
这个 Servlet 剖析 JSON ,并将数据取出后再传回文字响应。
如果将 JSON 字符串传回给客户端浏览器,则可以使用 eval() 将之运算为一个 JavaScript 对象以进行操作。