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

woaidongmao

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

JSON 入門指南

級別: 初級

雪峰, 撰稿人

2008 8 22

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

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

現(xiàn)在, JSON Web 應(yīng)用開發(fā)者提供了另一種數(shù)據(jù)交換格式。讓我們來看看 JSON 到底是什么,同 XML HTML 片段相比,JSON 提供了更好的簡單性和靈活性。

clip_image001

Ajax 資源中心

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

JSON 數(shù)據(jù)格式解析

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

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

"abc"

 

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


1. String 的完整表示結(jié)構(gòu)
clip_image002

一個 Number 可以根據(jù)整型或浮點數(shù)表示如下:


2. Number 的表示結(jié)構(gòu)
clip_image003

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

12345(整數(shù))

 -3.9e10(浮點數(shù))

 

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

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

["abc",12345,false,null]

 

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

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

city:Beijing

 street:Chaoyang Road

 postcode:100025(整數(shù))

 

JSON 表示如下:

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

 

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

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

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

}

 

JavaScript 處理 JSON 數(shù)據(jù)

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

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

function handleJson() {

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

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

  };

  document.write(j.name);

  document.write(j.address.city);

 }

 

假定服務(wù)器返回的 JSON 數(shù)據(jù)是上文的:

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

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

}

 

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

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

  method: "get",

  onSuccess: function(transport) {

    var json = transport.responseText.evalJSON();

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

  }

 });

 

服務(wù)器端輸出 JSON 格式數(shù)據(jù)

下面我們討論如何在服務(wù)器端輸出 JSON 格式的數(shù)據(jù)。以 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 的多態(tài),我們可以處理 IntegerLongFloat 等多種 Number 格式:

 

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

    return number.toString();

 }

 

 

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

 

 static String boolean2Json(Boolean bool) {

    return bool.toString();

 }

 

 

要將數(shù)組編碼為 JSON 格式,可以通過循環(huán)將每一個元素編碼出來:

 

 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(',');

    }

    // 將最后添加的 ',' 變?yōu)?span lang=EN-US> ']':

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

    return sb.toString();

 }

 

 

最后,我們需要將 Map<String, Object> 編碼為 JSON 格式,因為 JavaScript Object 實際上對應(yīng)的是 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(',');

    }

    // 將最后的 ',' 變?yōu)?span lang=EN-US> '}':

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

    return sb.toString();

 }

 

 

為了統(tǒng)一處理任意的 Java 對象,我們編寫一個入口方法 toJson(Object),能夠?qū)⑷我獾?span lang=EN-US> 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 對象作嚴(yán)格的檢查。不被支持的對象(例如 List)將直接拋出 RuntimeException 。此外,為了保證輸出的 JSON 是有效的,Map<String, Object> 對象的 Key 也不能包含特殊字符。細(xì)心的讀者可能還會發(fā)現(xiàn)循環(huán)引用的對象會引發(fā)無限遞歸,例如,精心構(gòu)造一個循環(huán)引用的 Map,就可以檢測到 StackOverflowException

 

 @Test(expected=StackOverflowError.class)

 public void testRecurrsiveMap2Json() {

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

    map.put("key", map);

    JsonUtil.map2Json(map);

 }

 

 

好在服務(wù)器處理的 JSON 數(shù)據(jù)最終都應(yīng)該轉(zhuǎn)化為簡單的 JavaScript 對象,因此,遞歸引用的可能性很小

最后,通過 Servlet MVC 框架輸出 JSON 時,需要設(shè)置正確的 MIME 類型(application/json)和字符編碼。假定服務(wù)器使用 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();

 

 

小結(jié)

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

 

clip_image005
clip_image006

clip_image008

 

下載

描述

名字

大小

下載方法

本文完整的源代碼

jeedev-util.zip

90 KB

HTTP

 

clip_image010

clip_image011

關(guān)于下載方法的信息

 

 

 

 

posted on 2009-07-28 11:37 肥仔 閱讀(1517) 評論(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>
            一二美女精品欧洲| 亚洲美女视频在线观看| 亚洲欧美日韩一区二区在线| 亚洲精品色婷婷福利天堂| 免费精品99久久国产综合精品| 午夜精品久久久久久久99樱桃 | 欧美激情视频在线免费观看 欧美视频免费一| 亚洲欧美韩国| 久久精品视频免费| 免费视频一区| 国产精品高清网站| 国产一区二区| 亚洲三级性片| 欧美一区1区三区3区公司| 久久视频国产精品免费视频在线| 欧美国产第一页| 夜夜嗨av色一区二区不卡| 欧美在线地址| 欧美精品一级| 国产视频精品免费播放| 亚洲激情成人| 性欧美xxxx大乳国产app| 久久精品五月婷婷| 亚洲国产精品一区制服丝袜| 久久午夜av| 亚洲伦理精品| 久久久久国内| 国产精品久久久久影院亚瑟| 尤物yw午夜国产精品视频明星| 一区二区三区免费网站| 久久在线视频在线| 亚洲午夜激情网站| 欧美丰满高潮xxxx喷水动漫| 国产日韩欧美一区二区| 夜夜嗨av一区二区三区免费区| 久久精品主播| 一区二区日韩欧美| 久久在线免费观看| 国产欧美日韩综合| 一区二区三区四区五区视频 | 精品99一区二区| 亚洲性视频网站| 亚洲高清免费视频| 久久久xxx| 国产视频欧美| 亚洲欧美日韩天堂| 亚洲人成精品久久久久| 久久亚洲一区二区三区四区| 国产九色精品成人porny| 在线一区二区三区做爰视频网站 | 亚洲已满18点击进入久久| 欧美国产先锋| 亚洲高清视频一区二区| 久久久久久九九九九| 在线亚洲电影| 欧美日韩综合一区| 一区二区三区免费看| 亚洲人成啪啪网站| 欧美**人妖| 亚洲电影免费在线观看| 欧美成人网在线| 久久一区二区三区四区五区| 伊人激情综合| 亚洲成色www久久网站| 免费国产一区二区| 日韩午夜中文字幕| av成人老司机| 国产精品亚洲精品| 久久国产手机看片| 香蕉久久国产| 在线成人h网| 亚洲国产成人高清精品| 欧美国产精品一区| 国产精品99久久99久久久二8 | 亚洲人成人99网站| 久久久久这里只有精品| 在线免费高清一区二区三区| 蜜臀久久99精品久久久画质超高清 | 猛干欧美女孩| 一区二区三区四区五区精品视频| 一本久道久久久| 国产精品入口尤物| 久久香蕉国产线看观看av| 老司机精品视频一区二区三区| 亚洲精品在线二区| 亚洲深夜激情| 黄色国产精品一区二区三区| 欧美成人免费在线视频| 欧美日韩精品一区视频| 亚洲性xxxx| 久久婷婷综合激情| 亚洲调教视频在线观看| 久久国产一二区| 99这里只有久久精品视频| 亚洲欧美资源在线| 亚洲精品久久久久久久久| 亚洲一区二区三区欧美| 亚洲黄页视频免费观看| 香蕉久久国产| 亚洲制服丝袜在线| 欧美69视频| 久久久久久亚洲综合影院红桃| 欧美激情自拍| 毛片av中文字幕一区二区| 欧美视频精品在线观看| 欧美高潮视频| 国模精品娜娜一二三区| 一区二区三区欧美视频| 亚洲欧洲精品一区二区| 欧美一区二区三区另类| 亚洲综合欧美日韩| 欧美韩日一区| 免费短视频成人日韩| 国产精品午夜电影| 99精品热6080yy久久 | 在线观看日韩国产| 亚洲欧美一区二区精品久久久| 亚洲精品免费在线| 欧美在线你懂的| 久久av二区| 欧美日韩在线视频一区二区| 欧美顶级艳妇交换群宴| 黑人巨大精品欧美一区二区| 亚洲色诱最新| 亚洲午夜久久久久久久久电影网| 久久免费观看视频| 久久精品30| 欧美午夜免费| 99re66热这里只有精品3直播| 亚洲精品乱码久久久久久黑人| 久久久久欧美精品| 美女爽到呻吟久久久久| 红桃视频成人| 久久久亚洲一区| 欧美xart系列高清| 久久免费少妇高潮久久精品99| 亚洲激情一区二区三区| 久久久久网址| 免费久久99精品国产自| 韩国福利一区| 久久久在线视频| 免费观看成人鲁鲁鲁鲁鲁视频 | 欧美日韩小视频| 日韩视频在线永久播放| 欧美激情在线狂野欧美精品| 欧美日韩国产首页| 亚洲高清中文字幕| 亚洲美女黄色片| 欧美视频一区| 午夜精品剧场| 老司机免费视频久久| 亚洲福利视频网| 欧美激情一二三区| 一区二区三区免费网站| 性久久久久久久久| 国产亚洲精品资源在线26u| 欧美自拍丝袜亚洲| 欧美韩国一区| 在线性视频日韩欧美| 国产精品亚洲成人| 美女脱光内衣内裤视频久久影院 | 久久免费视频这里只有精品| 亚洲第一在线视频| 亚洲一区在线直播| 国内外成人在线视频| 免费欧美网站| 亚洲一区二区三区四区中文| 浪潮色综合久久天堂| 日韩视频精品在线| 国产午夜精品久久久久久免费视| 麻豆久久精品| 亚洲综合99| 欧美华人在线视频| 香蕉免费一区二区三区在线观看| 伊人久久大香线蕉av超碰演员| 欧美电影在线观看| 先锋影音国产精品| 亚洲欧洲一区二区在线观看| 欧美在线综合| 99视频精品| 红杏aⅴ成人免费视频| 欧美日韩一区二区三区高清| 久久国产精品电影| 夜夜嗨一区二区| 欧美大色视频| 新67194成人永久网站| 亚洲美女毛片| 影音先锋中文字幕一区二区| 国产精品久久久久9999| 欧美11—12娇小xxxx| 欧美一级免费视频| 中文日韩在线视频| 亚洲精品视频一区| 久久综合色88| 久久国产黑丝| 亚洲一区综合| 日韩天堂av| 亚洲高清一区二| 狠狠色狠狠色综合日日五| 国产精品嫩草久久久久|