青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

JSON 入門指南

級別: 初級

雪峰, 撰稿人

2008 8 22

JSON JavaScript Object Natation,它是一種輕量級的數據交換格式,非常適合于服務器與 JavaScript 的交互。本文將快速講解 JSON 格式,并通過代碼示例演示如何分別在客戶端和服務器端進行 JSON 格式數據的處理。

盡管有許多宣傳關于 XML 如何擁有跨平臺,跨語言的優勢,然而,除非應用于 Web Services,否則,在普通的 Web 應用中,開發者經常為 XML 的解析傷透了腦筋,無論是服務器端生成或處理 XML,還是客戶端用 JavaScript 解析 XML,都常常導致復雜的代碼,極低的開發效率。實際上,對于大多數 Web 應用來說,他們根本不需要復雜的 XML 來傳輸數據,XML 的擴展性很少具有優勢,許多 AJAX 應用甚至直接返回 HTML 片段來構建動態 Web 頁面。和返回 XML 并解析它相比,返回 HTML 片段大大降低了系統的復雜性,但同時缺少了一定的靈活性。

現在, JSON Web 應用開發者提供了另一種數據交換格式。讓我們來看看 JSON 到底是什么,同 XML HTML 片段相比,JSON 提供了更好的簡單性和靈活性。

clip_image001

Ajax 資源中心

請訪問 Ajax 資源中心,這是有關 Ajax 編程模型信息的一站式中心,包括很多文檔、教程、論壇、blogwiki 和新聞。任何 Ajax 的新信息都能在這里找到。

JSON 數據格式解析

XML 一樣,JSON 也是基于純文本的數據格式。由于 JSON 天生是為 JavaScript 準備的,因此,JSON 的數據格式非常簡單,您可以用 JSON 傳輸一個簡單的 StringNumberBoolean,也可以傳輸一個數組,或者一個復雜的 Object 對象。

StringNumber Boolean JSON 表示非常簡單。例如,用 JSON 表示一個簡單的 String abc ”,其格式為:

"abc"

 

除了字符 "\/ 和一些控制符(\b\f\n\r\t)需要編碼外,其他 Unicode 字符可以直接輸出。下圖是一個 String 的完整表示結構:


1. String 的完整表示結構
clip_image002

一個 Number 可以根據整型或浮點數表示如下:


2. Number 的表示結構
clip_image003

這與絕大多數編程語言的表示方法一致,例如:

12345(整數)

 -3.9e10(浮點數)

 

Boolean 類型表示為 true false 。此外,JavaScript 中的 null 被表示為 null,注意,truefalse null 都沒有雙引號,否則將被視為一個 String

JSON 還可以表示一個數組對象,使用 [] 包含所有元素,每個元素用逗號分隔,元素可以是任意的 Value,例如,以下數組包含了一個 StringNumberBoolean 和一個 null

["abc",12345,false,null]

 

Object 對象在 JSON 中是用 {} 包含一系列無序的 Key-Value 鍵值對表示的,實際上此處的 Object 相當于 Java 中的 Map<String, Object>,而不是 Java Class 。注意 Key 只能用 String 表示。

例如,一個 Address 對象包含如下 Key-Value

city:Beijing

 street:Chaoyang Road

 postcode:100025(整數)

 

JSON 表示如下:

{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}

 

其中 Value 也可以是另一個 Object 或者數組,因此,復雜的 Object 可以嵌套表示,例如,一個 Person 對象包含 name address 對象,可以表示如下:

{"name":"Michael","address":

    {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}

}

 

JavaScript 處理 JSON 數據

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

我們先討論如何在 Web 頁面中用 JavaScript 處理 JSON 數據。我們通過一個簡單的 JavaScript 方法就能看到客戶端如何將 JSON 數據表示給用戶:

function handleJson() {

  var j={"name":"Michael","address":

      {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}

  };

  document.write(j.name);

  document.write(j.address.city);

 }

 

假定服務器返回的 JSON 數據是上文的:

{"name":"Michael","address":

    {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}

}

 

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

new Ajax.Request("http://url", {

  method: "get",

  onSuccess: function(transport) {

    var json = transport.responseText.evalJSON();

    // TODO: document.write(json.xxx);

  }

 });

 

服務器端輸出 JSON 格式數據

下面我們討論如何在服務器端輸出 JSON 格式的數據。以 Java 為例,我們將演示將一個 Java 對象編碼為 JSON 格式的文本。

String 對象編碼為 JSON 格式時,只需處理好特殊字符即可。另外,必須用 (") 而非 (') 表示字符串:

 

 static String string2Json(String s) {

    StringBuilder sb = new StringBuilder(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();

 }

 

 

Number 表示為 JSON 就容易得多,利用 Java 的多態,我們可以處理 IntegerLongFloat 等多種 Number 格式:

 

 static String number2Json(Number number) { //---- 繼承關系

    return number.toString();

 }

 

 

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

 

 static String boolean2Json(Boolean bool) {

    return bool.toString();

 }

 

 

要將數組編碼為 JSON 格式,可以通過循環將每一個元素編碼出來:

 

 static String array2Json(Object[] array) {

    if (array.length==0)

        return "[]";

    StringBuilder sb = new StringBuilder(array.length << 4);

    sb.append('[');

    for (Object o : array) {

        sb.append(toJson(o));

        sb.append(',');

    }

    // 將最后添加的 ',' 變為 ']':

    sb.setCharAt(sb.length()-1, ']');

    return sb.toString();

 }

 

 

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

 

 static String map2Json(Map<String, Object> map) {

    if (map.isEmpty())

        return "{}";

    StringBuilder sb = new StringBuilder(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();

 }

 

 

為了統一處理任意的 Java 對象,我們編寫一個入口方法 toJson(Object),能夠將任意的 Java 對象編碼為 JSON 格式:

 

 public static String toJson(Object o) {

    if (o==null)

        return "null";

    if (o instanceof String)

        return string2Json((String)o);

    if (o instanceof Boolean)

        return boolean2Json((Boolean)o);

    if (o instanceof Number)

        return number2Json((Number)o);

    if (o instanceof Map)

        return map2Json((Map<String, Object>)o);

    if (o instanceof Object[])

        return array2Json((Object[])o);

    throw new RuntimeException("Unsupported type: " + o.getClass().getName());

 }

 

 

我們并未對 Java 對象作嚴格的檢查。不被支持的對象(例如 List)將直接拋出 RuntimeException 。此外,為了保證輸出的 JSON 是有效的,Map<String, Object> 對象的 Key 也不能包含特殊字符。細心的讀者可能還會發現循環引用的對象會引發無限遞歸,例如,精心構造一個循環引用的 Map,就可以檢測到 StackOverflowException

 

 @Test(expected=StackOverflowError.class)

 public void testRecurrsiveMap2Json() {

    Map<String, Object> map = new HashMap<String, Object>();

    map.put("key", map);

    JsonUtil.map2Json(map);

 }

 

 

好在服務器處理的 JSON 數據最終都應該轉化為簡單的 JavaScript 對象,因此,遞歸引用的可能性很小

最后,通過 Servlet MVC 框架輸出 JSON 時,需要設置正確的 MIME 類型(application/json)和字符編碼。假定服務器使用 UTF-8 編碼,則可以使用以下代碼輸出編碼后的 JSON 文本:

 

 response.setContentType("application/json;charset=UTF-8");

 response.setCharacterEncoding("UTF-8");

 PrintWriter pw = response.getWriter();

 pw.write(JsonUtil.toJson(obj));

 pw.flush();

 

 

小結

JSON 已經是 JavaScript 標準的一部分。目前,主流的瀏覽器對 JSON 支持都非常完善。應用 JSON,我們可以從 XML 的解析中擺脫出來,對那些應用 Ajax Web 2.0 網站來說,JSON 確實是目前最靈活的輕量級方案。

 

clip_image005
clip_image006

clip_image008

 

下載

描述

名字

大小

下載方法

本文完整的源代碼

jeedev-util.zip

90 KB

HTTP

 

clip_image010

clip_image011

關于下載方法的信息

 

 

 

 

posted on 2009-07-28 11:37 肥仔 閱讀(1514) 評論(0)  編輯 收藏 引用 所屬分類: Web-前臺

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲午夜精品| 亚洲在线成人| 欧美视频免费看| 欧美日韩精品一本二本三本| 欧美黄色成人网| 欧美激情亚洲另类| 欧美激情四色| 国产精品久久久| 国产日韩精品视频一区二区三区| 国产日韩欧美精品综合| 在线成人www免费观看视频| 亚洲欧洲精品一区二区三区| 日韩午夜激情电影| 亚洲欧美综合| 嫩模写真一区二区三区三州| 亚洲日本国产| 亚洲一区三区在线观看| 久久激情中文| 欧美日韩大陆在线| 国际精品欧美精品| 亚洲伦理中文字幕| 久久爱91午夜羞羞| 亚洲欧洲午夜| 久久gogo国模啪啪人体图| 欧美大色视频| 国产亚洲欧美另类一区二区三区| 亚洲国产精品悠悠久久琪琪| 亚洲专区在线| 欧美激情精品久久久久久蜜臀| 中文在线一区| 欧美国产日本在线| 国产亚洲精品aa| 亚洲少妇在线| 亚洲国产精品一区二区久| 一区二区免费看| 久久精品盗摄| 最新国产の精品合集bt伙计| 欧美一区二区国产| 欧美日韩一区二区三区四区在线观看 | 亚洲国产精品第一区二区| 亚洲视频一二区| 欧美日本在线视频| 在线观看日韩av| 欧美在线亚洲在线| 一区二区三区久久网| 欧美韩日精品| 亚洲国产精品尤物yw在线观看 | 国产乱码精品一区二区三区忘忧草| 亚洲国产精品va在看黑人| 久久激情综合网| 亚洲欧美国产视频| 国产精品久久久久久久久久久久久久 | 欧美福利一区二区| 久久成人精品电影| 国产午夜亚洲精品理论片色戒| 亚洲一区黄色| 亚洲午夜一区二区三区| 欧美久色视频| 99精品国产在热久久下载| 欧美黑人一区二区三区| 免费日韩av电影| 亚洲精品护士| 亚洲欧洲在线视频| 欧美日韩在线播放三区| 一本色道久久综合精品竹菊| 亚洲美洲欧洲综合国产一区| 欧美日韩国产一中文字不卡 | 一区二区三区在线免费播放| 久久国产精品色婷婷| 亚洲欧美色婷婷| 国内精品国产成人| 美乳少妇欧美精品| 欧美成人自拍| 亚洲一级高清| 亚洲欧美日韩在线观看a三区| 国产乱人伦精品一区二区| 欧美日韩高清在线| 激情久久综艺| 亚洲欧美成人| 亚洲综合欧美| 狠狠色丁香久久婷婷综合丁香 | 在线性视频日韩欧美| 日韩亚洲一区在线播放| 国产精品久久久免费| 久久精品国产一区二区三| 久久久久久999| 夜夜嗨av色一区二区不卡| 亚洲午夜在线观看| 伊大人香蕉综合8在线视| 亚洲第一二三四五区| 欧美日韩亚洲高清一区二区| 欧美一级午夜免费电影| 美玉足脚交一区二区三区图片| 亚洲最新在线| 久久不射网站| 亚洲天堂av图片| 久久久久久国产精品一区| 9i看片成人免费高清| 欧美伊人久久大香线蕉综合69| 亚洲人屁股眼子交8| 亚洲欧美综合另类中字| 亚洲激情在线视频| 性娇小13――14欧美| 一区二区av| 久久综合影视| 久久精品免视看| 欧美日韩亚洲一区二区三区在线| 久久久噜久噜久久综合| 国产精品成人aaaaa网站| 欧美 亚欧 日韩视频在线| 国产精品天天摸av网| 亚洲激情视频网站| 国内久久精品| 亚洲在线1234| 亚洲一级特黄| 欧美激情一区二区在线 | 欧美大片第1页| 久久久久9999亚洲精品| 欧美日韩情趣电影| 欧美国产视频一区二区| 国产一区二区三区久久精品| 在线一区二区三区四区| 日韩一级二级三级| 免费视频一区| 免费永久网站黄欧美| 国产在线不卡| 欧美一区二视频| 欧美在线亚洲综合一区| 国产精品入口尤物| 一本一本久久a久久精品综合麻豆| 亚洲欧洲日本专区| 免费精品99久久国产综合精品| 老鸭窝91久久精品色噜噜导演| 国产日韩精品一区二区浪潮av| 亚洲综合久久久久| 欧美与黑人午夜性猛交久久久| 国产精品日韩久久久久| 亚洲国产精品电影在线观看| 亚洲国产精品传媒在线观看| 黄色精品在线看| 久久精品国产欧美激情| 久久精品亚洲热| 国产亚洲午夜| 久久久久久高潮国产精品视| 美女国内精品自产拍在线播放| 伊人久久大香线蕉综合热线| 久久久久亚洲综合| 欧美激情视频在线播放| 日韩一级免费观看| 欧美午夜一区二区| 亚洲欧美一区二区精品久久久| 久久久99久久精品女同性| 一区在线播放视频| 欧美chengren| 99精品免费网| 欧美制服丝袜第一页| 在线国产日韩| 欧美日韩国产美女| 亚洲自拍三区| 媚黑女一区二区| 一道本一区二区| 国产欧美精品在线播放| 久久福利资源站| 亚洲精品少妇| 久久夜色精品一区| 中文一区二区| 国产一区二区高清| 欧美精品激情blacked18| 亚洲天堂成人| 欧美成人激情视频| 亚洲免费视频一区二区| 一区二区三区在线免费视频| 欧美激情一区二区三区蜜桃视频 | 9久re热视频在线精品| 久久成人精品一区二区三区| 亚洲国产精品成人久久综合一区| 欧美日韩调教| 久久午夜精品一区二区| 一区二区欧美精品| 免费观看成人| 先锋影音国产精品| 亚洲剧情一区二区| 国产在线一区二区三区四区| 欧美日韩国产片| 久久全球大尺度高清视频| 亚洲午夜精品福利| 亚洲七七久久综合桃花剧情介绍| 久久www免费人成看片高清| 亚洲免费成人av| 狠狠操狠狠色综合网| 国产精品日韩欧美| 欧美精品乱码久久久久久按摩| 久久精品亚洲国产奇米99| 一区二区av在线| 最近看过的日韩成人| 老司机精品久久| 久久精品成人一区二区三区蜜臀| 亚洲天堂视频在线观看| 亚洲精选国产| 亚洲激情在线观看|