1. 程式人生 > >JSON(二):伺服器端和客戶端的JSON處理

JSON(二):伺服器端和客戶端的JSON處理

    上面介紹瞭如何用 JSON表示資料,接下來,我們還要解決如何在伺服器端生成 JSON 格式的資料以便傳送到客戶端,以及客戶端如何使用 JavaScript 處理 JSON 格式的資料。

    先來看看伺服器如何輸出JSON格式的資料吧。

    以 Java 為例,我們將演示將一個Java 物件編碼為 JSON 格式的文字。將 String 物件編碼為 JSON格式時,只需處理好特殊字元即可。另外,必須用 (") 而非 (') 表示字串:

<span style="font-family:SimHei;font-size:18px;">static Stringstring2Json(String s) { 
    StringBuilder sb = newStringBuilder(s.length()+20); 
    sb.append('\"'); 
    for (int i=0; i<s.length(); i++) {
        char c = s.charAt(i); 
        switch (c) { 
        case '\"': 
           sb.append("\\\""); 
            break; 
        case '\\': 
            sb.append("\\\\");
            break; 
        case '/': 
            sb.append("\\/");
            break; 
        case '\b': 
            sb.append("\\b");
            break; 
        case '\f': 
            sb.append("\\f");
            break; 
        case '\n': 
            sb.append("\\n");
            break; 
        case '\r': 
            sb.append("\\r");
            break; 
        case '\t': 
            sb.append("\\t");
            break; 
        default: 
            sb.append(c); 
        } 
    } 
    sb.append('\"'); 
    return sb.toString(); 
 }</span>

    將 Number 表示為 JSON就容易得多,利用 Java 的多型,我們可以處理 Integer,Long,Float 等多種 Number 格式:

<span style="font-family:SimHei;font-size:18px;">static Stringnumber2Json(Number number) { 
    return number.toString(); 
 }</span>

    Boolean型別也可以直接通過 toString() 方法得到 JSON的表示:

<span style="font-family:SimHei;font-size:18px;"> static Stringboolean2Json(Boolean bool) { 
    return bool.toString(); 
 }</span>

    要將陣列編碼為 JSON格式,可以通過迴圈將每一個元素編碼出來:

<span style="font-family:SimHei;font-size:18px;">static String array2Json(Object[] array) {
    if (array.length==0) 
        return "[]"; 
    StringBuilder sb = newStringBuilder(array.length << 4); 
    sb.append('['); 
    for (Object o : array) { 
        sb.append(toJson(o)); 
        sb.append(','); 
    } 
    // 將最後新增的 ',' 變為 ']': 
    sb.setCharAt(sb.length()-1, ']');
    return sb.toString(); 
 }</span>

    最後,我們需要將 Map<String, Object> 編碼為 JSON格式,因為JavaScript Object實際上對應的是 Java  Map<String, Object> 。該方法如下:

<span style="font-family:SimHei;font-size:18px;"> static Stringmap2Json(Map<String, Object> map) { 
    if (map.isEmpty()) 
        return "{}"; 
    StringBuilder sb = newStringBuilder(map.size() << 4); 
    sb.append('{'); 
    Set<String> keys =map.keySet(); 
    for (String key : keys) { 
        Object value = map.get(key);
        sb.append('\"'); 
        sb.append(key); 
        sb.append('\"'); 
        sb.append(':'); 
        sb.append(toJson(value));
        sb.append(','); 
    } 
    // 將最後的 ',' 變為 '}': 
    sb.setCharAt(sb.length()-1, '}');
    return sb.toString(); 
 }</span>

    現在伺服器端可以將各種資料型別的資料輸出為JSON格式,那麼客戶端如何接受並顯示這些資料呢?接下來我們就看看客戶端如何使用JavaScript處理JSON格式的資料吧。假定伺服器返回的 JSON 資料是上文的:

{"name":"Michael","address":
   {"city":"Beijing","street":" ChaoyangRoad ","postcode":100025}
}

    我們通過一個簡單的 JavaScript方法就能看到客戶端如何將 JSON 資料表示給使用者:

<span style="font-family:SimHei;font-size:18px;">function handleJson() { 
  varj={"name":"Michael","address":
     {"city":"Beijing","street":" ChaoyangRoad ","postcode":100025}
  }; 
  document.write(j.name); 
  document.write(j.address.city); 
 }</span>

    只需將其賦值給一個JavaScript 變數,就可以立刻使用該變數並更新頁面中的資訊了,相比 XML 需要從 DOM 中讀取各種節點而言,JSON的使用非常容易。我們需要做的僅僅是傳送一個 Ajax 請求,然後將伺服器返回的 JSON 資料賦值給一個變數即可。有許多 Ajax 框架早已包含了處理JSON 資料的能力,例如 Prototype(一個流行的 JavaScript 庫:http://prototypejs.org)提供了 evalJSON() 方法,能直接將伺服器返回的 JSON文字變成一個JavaScript 變數:

<span style="font-family:SimHei;font-size:18px;">new Ajax.Request("http://url", {
  method: "get", 
  onSuccess: function(transport) {
    var json = transport.responseText.evalJSON();
    // TODO: document.write(json.xxx);
  } 
 });</span>