最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JSON 入門指南 想了解json的朋友可以看下

 更新時間:2009年08月26日 00:58:50   作者:  
JSON 即 JavaScript Object Natation,它是一種輕量級的數(shù)據(jù)交換格式,非常適合于服務(wù)器與 JavaScript 的交互。本文將快速講解 JSON 格式,并通過代碼示例演示如何分別在客戶端和服務(wù)器端進(jìn)行 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 的擴(kuò)展性很少具有優(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 提供了更好的簡單性和靈活性。
Ajax 資源中心
請訪問 Ajax 資源中心,這是有關(guān) Ajax 編程模型信息的一站式中心,包括很多文檔、教程、論壇、blog、wiki 和新聞。任何 Ajax 的新信息都能在這里找到。
JSON 數(shù)據(jù)格式解析
和 XML 一樣,JSON 也是基于純文本的數(shù)據(jù)格式。由于 JSON 天生是為 JavaScript 準(zhǔn)備的,因此,JSON 的數(shù)據(jù)格式非常簡單,您可以用 JSON 傳輸一個簡單的 String,Number,Boolean,也可以傳輸一個數(shù)組,或者一個復(fù)雜的 Object 對象。
String,Number 和 Boolean 用 JSON 表示非常簡單。例如,用 JSON 表示一個簡單的 String “ abc ”,其格式為:
"abc"
除了字符 ",\,/ 和一些控制符(\b,\f,\n,\r,\t)需要編碼外,其他 Unicode 字符可以直接輸出。下圖是一個 String 的完整表示結(jié)構(gòu):
圖 1. String 的完整表示結(jié)構(gòu)
一個 Number 可以根據(jù)整型或浮點數(shù)表示如下:
圖 2. Number 的表示結(jié)構(gòu)
這與絕大多數(shù)編程語言的表示方法一致,例如:
12345(整數(shù))
-3.9e10(浮點數(shù))
Boolean 類型表示為 true 或 false 。此外,JavaScript 中的 null 被表示為 null,注意,true、false 和 null 都沒有雙引號,否則將被視為一個 String 。
JSON 還可以表示一個數(shù)組對象,使用 [] 包含所有元素,每個元素用逗號分隔,元素可以是任意的 Value,例如,以下數(shù)組包含了一個 String,Number,Boolean 和一個 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 格式時,只需處理好特殊字符即可。另外,必須用 (") 而非 (') 表示字符串:
復(fù)制代碼 代碼如下:

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),我們可以處理 Integer,Long,F(xiàn)loat 等多種 Number 格式:
復(fù)制代碼 代碼如下:

static String number2Json(Number number) {
return number.toString();
}

Boolean 類型也可以直接通過 toString() 方法得到 JSON 的表示:
復(fù)制代碼 代碼如下:

static String boolean2Json(Boolean bool) {
return bool.toString();
}

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

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)?']':
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}

最后,我們需要將 Map<String, Object> 編碼為 JSON 格式,因為 JavaScript 的 Object 實際上對應(yīng)的是 Java 的 Map<String, Object> 。該方法如下:
復(fù)制代碼 代碼如下:

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)?'}':
sb.setCharAt(sb.length()-1, '}');
return sb.toString();
}

為了統(tǒng)一處理任意的 Java 對象,我們編寫一個入口方法 toJson(Object),能夠?qū)⑷我獾?Java 對象編碼為 JSON 格式:
復(fù)制代碼 代碼如下:

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: 
復(fù)制代碼 代碼如下:

@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 文本:
復(fù)制代碼 代碼如下:

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 確實是目前最靈活的輕量級方案。

相關(guān)文章

  • 深入分析jsonp協(xié)議原理

    深入分析jsonp協(xié)議原理

    JSONP的最基本的原理是:動態(tài)添加一個<script>標(biāo)簽,而script標(biāo)簽的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax XmlHttpRequest協(xié)議無關(guān)了。
    2015-09-09
  • JSON掃盲帖 JSON.as類教程

    JSON掃盲帖 JSON.as類教程

    如果json字符串是從html用FlashVars來傳遞參數(shù)時那么字符串中的第一個雙引號(包括雙引號)以后的內(nèi)容就不會得到傳送.
    2009-02-02
  • javascript操作JSON的要領(lǐng)總結(jié)

    javascript操作JSON的要領(lǐng)總結(jié)

    JSON是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON數(shù)據(jù)不須要任何特殊的 API 或工具包,需要的朋友可以了解下
    2012-12-12
  • XENON基于JSON變種

    XENON基于JSON變種

    JSON已經(jīng)成為了現(xiàn)在互聯(lián)網(wǎng)上輕量級數(shù)據(jù)傳輸?shù)氖聦崢?biāo)準(zhǔn),現(xiàn)在已經(jīng)很少聽說哪個流行的web API不支持JSON了,而很多內(nèi)部或者專用的應(yīng)用程序也都在使用JSON來傳遞數(shù)據(jù)。
    2010-07-07
  • js+json用表格實現(xiàn)簡單網(wǎng)站左側(cè)導(dǎo)航

    js+json用表格實現(xiàn)簡單網(wǎng)站左側(cè)導(dǎo)航

    閑暇之余,制作一用表格實現(xiàn)的簡單的網(wǎng)站導(dǎo)航條,分享給大家。這里的數(shù)據(jù)基于json格式,學(xué)習(xí)json的朋友可以參考下。
    2010-04-04
  • JSONP跨域GET請求解決Ajax跨域訪問問題

    JSONP跨域GET請求解決Ajax跨域訪問問題

    本文主要是介紹了JSONP跨域是如何實現(xiàn)的,并探討下JSONP跨域的原理。以及采用JSONP跨域GET請求解決Ajax跨域訪問問題,需要的朋友可以參考下
    2014-12-12
  • Ajax中解析Json的兩種方法對比分析

    Ajax中解析Json的兩種方法對比分析

    這里給大家介紹的是Ajax中解析Json的兩種方法對比分析,十分的實用,本文為學(xué)習(xí)筆記,屬新手文章,歡迎指教!
    2015-06-06
  • JSON相關(guān)知識匯總

    JSON相關(guān)知識匯總

    本文給大家匯總了一下關(guān)于json的相關(guān)的知識點,從基礎(chǔ)到示例,非常全面,有需要的小伙伴可以參考下。
    2015-07-07
  • XML的代替者----JSON

    XML的代替者----JSON

    XML的代替者----JSON...
    2007-07-07
  • json的前臺操作和后臺操作實現(xiàn)代碼

    json的前臺操作和后臺操作實現(xiàn)代碼

    通常情況下,json的在項目中的應(yīng)用都是在后臺把數(shù)據(jù)傳到前臺,然后前臺再獲取json中的數(shù)據(jù).
    2012-01-01

最新評論

岐山县| 禹州市| 阜新| 新蔡县| 望城县| 禄丰县| 兴宁市| 佛山市| 弋阳县| 哈尔滨市| 桂平市| 大理市| 和龙市| 北辰区| 南和县| 乌拉特前旗| 靖远县| 武功县| 内丘县| 石城县| 阿拉尔市| 罗山县| 库伦旗| 清水河县| 连城县| 松滋市| 澳门| 徐汇区| 浦城县| 公主岭市| 承德县| 乳山市| 珠海市| 甘孜县| 西吉县| 南溪县| 旺苍县| 成都市| 株洲县| 城市| 阿坝县|