盡管有許多宣傳關(guān)于XML如何擁有跨平臺(tái),跨語言的優(yōu)勢,然而,除非應(yīng)用于WebServices,否則,在普通的Web應(yīng)用中,開發(fā)者經(jīng)常為XML的解析傷透了腦筋,無論是服" />

黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

json(javascript object natation)

系統(tǒng) 2548 0
什么是json?

?

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

<!----><!----><!---->

盡管有許多宣傳關(guān)于 XML 如何擁有跨平臺(tái),跨語言的優(yōu)勢,然而,除非應(yīng)用于 Web Services,否則,在普通的 Web 應(yīng)用中,開發(fā)者經(jīng)常為 XML 的解析傷透了腦筋,無論是服務(wù)器端生成或處理 XML,還是客戶端用 JavaScript 解析 XML,都常常導(dǎo)致復(fù)雜的代碼,極低的開發(fā)效率。實(shí)際上,對于大多數(shù) Web 應(yīng)用來說,他們根本不需要復(fù)雜的 XML 來傳輸數(shù)據(jù),XML 的擴(kuò)展性很少具有優(yōu)勢,許多 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 提供了更好的簡單性和靈活性。

Ajax 資源中心

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

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

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

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

            "abc"
          

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


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

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


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

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

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

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

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

            ["abc",12345,false,null]
          

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

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

            city:Beijing
            street:Chaoyang Road
            postcode:100025(整數(shù))
          

用 JSON 表示如下:

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

其中 Value 也可以是另一個(gè) Object 或者數(shù)組,因此,復(fù)雜的 Object 可以嵌套表示,例如,一個(gè) 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ù)。我們通過一個(gè)簡單的 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}
            }
          

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

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

                        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 格式:

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

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

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

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

                        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 格式,因?yàn)?JavaScript 的 Object 實(shí)際上對應(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)?'}':
            sb.setCharAt(sb.length()-1, '}');
            return sb.toString();
            }
            
          

為了統(tǒng)一處理任意的 Java 對象,我們編寫一個(gè)入口方法 toJson(Object) ,能夠?qū)⑷我獾?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ì)心的讀者可能還會(huì)發(fā)現(xiàn)循環(huán)引用的對象會(huì)引發(fā)無限遞歸,例如,精心構(gòu)造一個(gè)循環(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í),需要設(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();
            
          

?下面是官方網(wǎng)站上面提供的一個(gè)例子:

    
var ?myJSONObject? = ? { " bindings " :?[ { " ircEvent " :? " PRIVMSG " ,? " method " :? " newURI " ,? " regex " :? " ^http://.* " } , { " ircEvent " :? " PRIVMSG " ,? " method " :? " deleteURI " ,? " regex " :? " ^delete.* " } , { " ircEvent " :? " PRIVMSG " ,? " method " :? " randomURI " ,? " regex " :? " ^random.* " } ] } ;

這個(gè)例子中,創(chuàng)建了一個(gè)對象,它只包含一個(gè)成員“bindings”。“bindings”中有一個(gè)包含了3個(gè)對象的數(shù)組,而這每個(gè)對象都有 "ircEvent" "method" "regex"3個(gè)成員。

?

myJSONObject.bindings[ 0 ].method?的值是? " newURI "

?


JSON官方網(wǎng)站提供的一個(gè)開源的JSON解析器和字符串轉(zhuǎn)換器: json.js

string.parseJSON() 解析函數(shù),它將JSON文本解析成object或者array,可以拋出一個(gè)語法錯(cuò)誤的異常;
array.toJSONString(),
boolean.toJSONString() ,
date.toJSONString(),
number.toJSONString(),????
object.toJSONString(),
string.toJSONString(): 這幾個(gè)函數(shù)可以生成JSON文本

下面寫一個(gè)簡單的解析和轉(zhuǎn)換的例子:

?

var ?str = '[ " 0 " , " 1 " ]';
var ?obj? = ?str.parseJSON();
document.write(obj[
0 ]);
document.write(obj[
1 ]);

?

結(jié)果是01

?

var ?doc? = ? new ?Array();
doc[
0 ] = ' 0 ';
doc[
1 ] = ' 1 ';
document.write(doc.toJSONString())

?

結(jié)果是["0","1"]?


資源
官方網(wǎng)站: http://www.json.org/
JSON解析和轉(zhuǎn)換器下載: http://www.json.org/json.js

json(javascript object natation)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論