JSON传送与接收(java)

JSON 中我们已经介绍过其基本格式,与 XML 相同, JSON 只是一个文字格式,只要客户端与伺服端可以剖析它,就可以利用它作为传送数据的格式,但它是 JavaScript 的核心特性之一,所以在 JavaScript 中使用 JSON 作为资料格式很方便,您还可以在 http://www.json.org 找到处理 JSON 的链接库,包括客户端 JavaScript library 与伺服端的 library

相较于 XML JSON 在资料表示时更为简洁,例如一个表示账户的资料, 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 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());

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

您可以把 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 对象以进行操作。 

猜你喜欢

转载自blog.csdn.net/Giraffe_zj/article/details/3343143