自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JSON是什么?為JavaScript準(zhǔn)備的數(shù)據(jù)格式

開發(fā) 前端
本文介紹了JSON是什么。和 XML 一樣,JSON 也是基于純文本的數(shù)據(jù)格式。JSON 的數(shù)據(jù)格式非常簡(jiǎn)單。

還不了解JSON是什么?看了下面這篇文章,您對(duì)JSON是什么應(yīng)該能夠有了一個(gè)比較清晰的概念。

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

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

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

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

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

String,Number 和 Boolean 用 JSON 表示非常簡(jiǎn)單。例如,用 JSON 表示一個(gè)簡(jiǎn)單的 String “ abc ”,其格式為:

"abc"

除了字符 ",\,/ 和一些控制符(\b,\f,\n,\r,\t)需要編碼外,其他 Unicode 字符可以直接輸出。 

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

  1. 12345(整數(shù))  
  2.  -3.9e10(浮點(diǎn)數(shù))  

Boolean 類型表示為 true 或 false 。此外,JavaScript. 中的 null 被表示為 null,注意,true、false 和 null 都沒有雙引號(hào),否則將被視為一個(gè) String 。

JSON 還可以表示一個(gè)數(shù)組對(duì)象,使用 [] 包含所有元素,每個(gè)元素用逗號(hào)分隔,元素可以是任意的 Value,例如,以下數(shù)組包含了一個(gè) String,Number,Boolean 和一個(gè) null:

["abc",12345,false,null]

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

例如,一個(gè) Address 對(duì)象包含如下 Key-Value:

  1. city:Beijing   
  2.  street:Chaoyang Road   
  3.  postcode:100025(整數(shù))  

用 JSON 表示如下:

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

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

  1. {"name":"Michael","address":  
  2.     {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}  
  3. }  

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

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

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

  1. function handleJson() {   
  2.   var j={"name":"Michael","address":  
  3.       {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}  
  4.   };   
  5.   document.write(j.name);   
  6.   document.write(j.address.city);   
  7.  }  

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

  1. {"name":"Michael","address":  
  2.     {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}  
  3. }  

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

  1. new Ajax.Request("http://url", {   
  2.   method: "get",   
  3.   onSuccess: function(transport) {   
  4.     var json = transport.responseText.evalJSON();   
  5.     // TODO: document.write(json.xxx);   
  6.   }   
  7.  });  

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

下面我們討論如何在服務(wù)器端輸出 JSON 格式的數(shù)據(jù)。以 Java 為例,我們將演示將一個(gè) Java 對(duì)象編碼為 JSON 格式的文本。

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

  1. static String string2Json(String s) {   
  2.    StringBuilder sb = new StringBuilder(s.length()+20);   
  3.    sb.append('\"');   
  4.    for (int i=0; i<s.length(); i++) {   
  5.        char c = s.charAt(i);   
  6.        switch (c) {   
  7.        case '\"':   
  8.            sb.append("\\\"");   
  9.            break;   
  10.        case '\\':   
  11.            sb.append("\\\\");   
  12.            break;   
  13.        case '/':   
  14.            sb.append("\\/");   
  15.            break;   
  16.        case '\b':   
  17.            sb.append("\\b");   
  18.            break;   
  19.        case '\f':   
  20.            sb.append("\\f");   
  21.            break;   
  22.        case '\n':   
  23.            sb.append("\\n");   
  24.            break;   
  25.        case '\r':   
  26.            sb.append("\\r");   
  27.            break;   
  28.        case '\t':   
  29.            sb.append("\\t");   
  30.            break;   
  31.        default:   
  32.            sb.append(c);   
  33.        }   
  34.    }   
  35.    sb.append('\"');   
  36.    return sb.toString();   
  37. }   
  38.   

將 Number 表示為 JSON 就容易得多,利用 Java 的多態(tài),我們可以處理 Integer,Long,F(xiàn)loat 等多種 Number 格式:

  1. static String number2Json(Number number) {   
  2.    return number.toString();   
  3. }   
  4.   

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

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

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

  1. static String array2Json(Object[] array) {   
  2.    if (array.length==0)   
  3.        return "[]";   
  4.    StringBuilder sb = new StringBuilder(array.length << 4);   
  5.    sb.append('[');   
  6.    for (Object o : array) {   
  7.        sb.append(toJson(o));   
  8.        sb.append(',');   
  9.    }   
  10.    // 將最后添加的 ',' 變?yōu)?nbsp;']':   
  11.    sb.setCharAt(sb.length()-1, ']');   
  12.    return sb.toString();   
  13. }  

最后,我們需要將 Map<String, Object> 編碼為 JSON 格式,因?yàn)?JavaScript. 的 Object 實(shí)際上對(duì)應(yīng)的是 Java 的 Map<String, Object> 。該方法如下:

  1. static String map2Json(Map<String, Object> map) {   
  2.    if (map.isEmpty())   
  3.        return "{}";   
  4.    StringBuilder sb = new StringBuilder(map.size() << 4);   
  5.    sb.append('{');   
  6.    Set<String> keys = map.keySet();   
  7.    for (String key : keys) {   
  8.        Object value = map.get(key);   
  9.        sb.append('\"');   
  10.        sb.append(key);   
  11.        sb.append('\"');   
  12.        sb.append(':');   
  13.        sb.append(toJson(value));   
  14.        sb.append(',');   
  15.    }   
  16.    // 將最后的 ',' 變?yōu)?nbsp;'}':   
  17.    sb.setCharAt(sb.length()-1, '}');   
  18.    return sb.toString();   
  19. }  

為了統(tǒng)一處理任意的 Java 對(duì)象,我們編寫一個(gè)入口方法 toJson(Object),能夠?qū)⑷我獾?Java 對(duì)象編碼為 JSON 格式:

  1. public static String toJson(Object o) {   
  2.     if (o==null)   
  3.         return "null";   
  4.     if (o instanceof String)   
  5.         return string2Json((String)o);   
  6.     if (o instanceof Boolean)   
  7.         return boolean2Json((Boolean)o);   
  8.     if (o instanceof Number)   
  9.         return number2Json((Number)o);   
  10.     if (o instanceof Map)   
  11.         return map2Json((Map<String, Object>)o);   
  12.     if (o instanceof Object[])   
  13.         return array2Json((Object[])o);   
  14.     throw new RuntimeException("Unsupported type: " + o.getClass().getName());   
  15.  }  

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

  1. @Test(expected=StackOverflowError.class)   
  2. public void testRecurrsiveMap2Json() {   
  3.    Map<String, Object> map = new HashMap<String, Object>();   
  4.    map.put("key", map);   
  5.    JsonUtil.map2Json(map);   

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

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

  1. response.setContentType("application/json;charset=UTF-8");   
  2. response.setCharacterEncoding("UTF-8");   
  3. PrintWriter pw = response.getWriter();   
  4. pw.write(JsonUtil.toJson(obj));   
  5. pw.flush();  

小結(jié)

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

JSON是什么,現(xiàn)在您應(yīng)該了解了吧。

【編輯推薦】

  1. JavaBean到XML和JSON的轉(zhuǎn)換
  2. 詳談基于JSON的高級(jí)AJAX開發(fā)技術(shù)
  3. JSP實(shí)例詳解JavaBean應(yīng)用步驟
  4. 詳解JSP中調(diào)用JavaBean
  5. JSP Servlet JavaBean在jdk6.0 Tomcat6.0下的構(gòu)建
責(zé)任編輯:yangsai 來源: Java技術(shù)網(wǎng)
相關(guān)推薦

2010-01-06 14:04:55

Json數(shù)據(jù)格式

2014-08-12 10:15:42

數(shù)據(jù)格式JSONXML

2013-03-27 10:51:44

iOSjson解析網(wǎng)絡(luò)交互數(shù)據(jù)格式解析

2018-09-18 11:16:11

MapReduceXML大數(shù)據(jù)

2011-04-11 09:48:59

AjaxWEB服務(wù)

2024-04-15 13:13:04

PythonJSON

2010-01-06 13:23:20

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

2024-11-12 12:08:06

JSON數(shù)據(jù)技巧

2010-06-28 09:09:24

SQL Server

2021-11-11 23:16:33

前端數(shù)據(jù)格式Web

2021-04-26 07:51:00

JavaScript方法函數(shù)

2011-04-11 13:14:58

AjaxWEB服務(wù)

2024-12-19 00:12:02

APIJSON數(shù)據(jù)

2010-07-09 10:42:38

HART協(xié)議

2010-07-09 10:27:33

SQL Server數(shù)

2022-06-05 14:57:35

發(fā)送釘釘運(yùn)維架構(gòu)

2011-03-07 15:01:42

MySQLXML數(shù)據(jù)

2010-01-06 14:08:33

JSON WEB站點(diǎn)

2019-07-22 08:49:37

PythonJSON編程語言

2009-03-09 09:34:56

AjaxHTMLJavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)