JSON传送与接收

来源:互联网 发布:java电商开源 编辑:程序博客网 时间:2024/05/17 23:58
 
JSON 中我们已经介绍过其基本格式,与XML相同,JSON只是一个文字格式,只要客户端与伺服端可以剖析它,就可以利用它作为传送数据的格式,但它是JavaScript的核心特性之一,所以在JavaScript中使用JSON作为资料格式很方便,您还可以在 http://www.json.org 找到处理JSON的链接库,包括客户端JavaScript library与伺服端的library

相较于XMLJSON在资料表示时更为简洁,例如一个表示账户的资料,XML中可能如下表示:
<account>
    <number>123456</number>
    <name>Justin</name>
    <balance>1000</balance>
</account>
                                                     
而使用JSON可以这么表示:
var account = {
    number : "123456",
    name: "Justin",
    balance: "1000"
};

您可以下载 http://www.json.org/json.js ,并将之加入至网页之中:
<script type="text/javascript" src="json.js"></script>

json.js
中有JSON parserJSON 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());

您可以按下 执行范例 观看结果。

您可以把JSON表示法以POST发送至伺服端,例如:
  • 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;
        }
    }
}

这个程序使用者输入的账号信息包装为对象,并使用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();
    }
}

这个Servlet剖析JSON,并将数据取出后再传回文字响应。

如果将JSON字符串传回给客户端浏览器,则可以使用eval()将之运算为一个JavaScript对象以进行操作。 
原文:http://blog.csdn.net/caterpillar_here/archive/2007/03/09/1525096.aspx