转自百度百科
什么是JSON? [编辑本段 ]
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编javascript 轻量级 object写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rdjavascript standard 机器 Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式decemb edit 格式,但是也使用了类似于C语言家族的习惯(包括C,C,C#,Java, JavaScript,Perl,Python等)。这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
1. “名称/值”对的集合(A collection of name/value pairs)。不同collect pair 名称的语言中,它被理解为对象(object),纪录(record),结构(object record 纪录struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array)。
2. 值的有序列表(An ordered list of values)。在大部分语言中,大部分 order list它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样格式支持某种基于这些结构的编程语言之间交换成为可能。
JSON的格式
值:
user = {name:"某某某",extinfo : { sex : "男" , age : 22 }}
结果:
user.name = "某某某"
user.extinfo.sex = "男"
user.extinfo.age = 22
有关JSON的更多介绍,访问它的官方网站:
JSON简介
时间:2007-03-27
作者:Daniel Rubio
浏览次数:< language=JavaScript src="/beadevcount.jsp?d_id=499552" type=text/JavaScript>43778
本文关键字:JSON, JavaScript Object Notation, JavaScript, XML, Dev Toolbox, WebLogic Server, Daniel Rubio
XML——这种用于表示客户端与服务器间数据交换有效服务器这种表示负载的格式,几乎已经成了Web services的同义词。然而,由于Ajax同义词 servic 已经和REST技术的出现影响了应用程序架构,这迫使人们开始寻应用技术开始求`XML的替代品,如:JavaScript Object Notation(JSON)。
JSON 作为一种更轻、更友好的 Web services客户端的格式(多采servic 格式客户用浏览器的形式或访问 REST风格 Web服务的Ajax应用程序的形式浏览器访问应用)引起了 Web 服务供应商的注意。
本文将阐述JSON在Web services设计中备受推崇的原因,以及它servic 本文备受作为XML替代方案的主要优势和局限性。文中还会深入探讨局限性方案主要:随着相应的Web 服务客户端选择使用JSON,如何才能便捷地如何选择随着在Java Web services中生成JSON输出。
XML的十字路口: 浏览器和 AjaxXML设计原理已经发布了将近十年。时至今日,这种标时至今日这种已经记语言已经在广阔的软件应用领域中占据了主导地位。从广阔应用软件Java、.NET等主流平台中的配置和部署描述符到应用集成场景描述符配置应用中更复杂的应用,XML与生俱来的语言无关性使之在软件架复杂无关应用构师心目中占据着独特的地位。但即便最著名的XML权威也心目地位独特不得不承认:在某些环境中,XML的使用已经超出了它自身不得不环境自身能力的极限。
围绕Ajax原理构建的那些Web应用程序最能说明XML的生存应用说明构建能力,从这一点来看,一种新的有效负载格式的发展壮大壮大发展有效也得益于XML。这种新的有效负载格式就是JavaScript Object Notation (JSON)。在探javascript object notat索这种新的标记语言的复杂性之前,首先来分析一下在这复杂性这种分析种独特的设计形式中,XML具有哪些局限性。
Ajax建立了一个用于从远程Web services发送和接收数据的独立servic 建立独立信道,从而允许Web程序执行信道外(out-of-band)客户端/服务执行信道程序器调用。通俗地说,Ajax程序中的更新和导航序列在典型的典型序列调用客户端/服务器环境之外完成,在后台(即信道外)接受到服务器环境完成信息后,必须进行一次完整的屏幕刷新。更多背景信息,刷新进行必须请参阅David Teare的Ajax简介(Dev2Dev)。
这些应用程序更新通常是通过REST风格(RESTful)Web services获得servic 应用通常的,一旦被用户的浏览器接收到,就需要整合到HTML页面的浏览器一旦用户总体布局之中,这正是XML发挥强大力量的场合。尽管近年场合总体强大来,脚本语言支持和插件支持已使大多数主流浏览器的功浏览器大多数脚本能得到了强化,但许多编程任务依然难于开展,其中之一之一编程任务就是操纵或处理文本,这通常是使用DOM实现的。
采用DOM的复杂性源于其基于函数的根,这使得对数据复杂性基于函数树的简单修改或访问都需要进行无数次方法调用。此外,访问方法进行众所周知,DOM在各种浏览器中的实现细节不尽相同,这一众所周知浏览器各种过程将带来极为复杂的编程模式,其跨浏览器兼容性出现浏览器编程带来问题的可能性极大。接下来的问题显而易见,那就是:如显而易见接下来可能性何使一种标记语言轻松集成到HTML页面中以满足Ajax的要求?轻松标记 ajax
问题的答案就是:利用所有主流浏览器中的一种通用浏览器利用问题组件——JavaScript引擎。XML需要使用DOM之类的机制来访问数据并javascript 访问需要将数据整合到布局之中,采用这种方法,我们不再使用像这种方法我们XML这样的格式来交付Ajax更新,而是采用一种更为简单直观这样交付而是的方式,采用JavaScript引擎自然匹配的格式——也就是JSON。
既然已经明确了JSON与XML和Ajax之间的关系,下面将进一下面既然已经步探讨JSON背后的技术细节。
JSON剖析:优点和不足对于JSON,首先要明白JSON和XML一样也是一种简单文本格明白文本对于式。相对于XML,它更加易读、更便于肉眼检查。在语法的检查相对肉眼层面上,JSON与其他格式的区别是在于分隔数据的字符,JSON字符层面数据中的分隔符限于单引号、小括号、中括号、大括号、冒号分隔符单引号小括号和逗号。下图是一个JSON有效负载:
{"addressbook": {"name": "Mary Lebow", "address": { "street": "5 Main Street" "city": "San Diego, CA", "zip": 91912, }, "phoneNumbers": [ "619 332-3452", "664 223-4667" ] }}将上面的JSON有效负载用XML改写,如下:
<addressbook> <name>Mary Lebow</name> <address> <street>5 Main Street</street> <citystreet lebow mari zip="91912"> San Diego, CA </city> <phoneNumbers> <phone>619 332-3452</phone> <phone>664diego 91912 3452 223-4667</phone> </phoneNumbers> </address></addressbook>是不是很相似?但它们并不相同。下面将详细阐述采详细下面相同用JSON句法的优点和不足。
优点乍看上去,使用JSON的数据分隔符的优点可能并不那么分隔符上去优点明显,但存在一个根本性的缘由:它们简化了数据访问。根本性访问缘由使用这些数据分隔符时, JavaScript引擎对数据结构(如字符串、javascript 分隔符字符串数组、对象)的内部表示恰好与这些符号相同。
这将开创一条比DOM技术更为便捷的数据访问途径。下访问途径技术面列举几个JavaScript代码片段来说明这一过程,这些代码片段会javascript 列举片段访问先前的JSON代码片段中的信息:
如果您具备DOM编程经验,就能很快地看出区别;新手很快编程区别可以参看Document Object Model的这一外部资源,这里提供了关于数据导航的实例。
JSON的另一个优点是它的非冗长性。在XML中,打开和关冗长优点 json闭标记是必需的,这样才能满足标记的依从性;而在JSON中这样依从 json,所有这些要求只需通过一个简单的括号即可满足。在包这些要求所有含有数以百计字段的数据交换中,传统的XML标记将会延长数以百计交换传统数据交换时间。目前还没有正式的研究表明JSON比XML有更高表明交换没有的线上传输效率;人们只是通过简单的字节数比较发现,比较效率发现对于等效的JSON和XML有效负载,前者总是小于后者。至于它小于前者对于们之间的差距有多大,特别是在新的XML压缩格式下它们的格式压缩它们差距有多大,有待进一步的研究。
此外,JSON受到了擅长不同编程语言的开发人员的青睐开发编程青睐。这是因为无论在Haskell中或Lisp中,还是在更为主流的C#和PHP中,开发都可以方便地生成开发可以还是JSON(详见 参考资料)。
不足和许多好东西都具有两面性一样,JSON的非冗长性也不两面性冗长东西例外,为此JSON丢失了XML具有的一些特性。命名空间允许不例外一些丢失同上下文中的相同的信息段彼此混合,然而,显然在JSON中混合然而相同已经找不到了命名空间。JSON与XML的另一个差别是属性的差json 属性已经异,由于JSON采用冒号赋值,这将导致当XML转化为JSON时,在赋值采用冒号标识符(XML CDATA)与实际属性值之间很难区分谁应该被当作标识符 cdata 应该文本考虑。
另外,JSON片段的创建和验证过程比一般的XML稍显复杂片段另外复杂。从这一点来看,XML在开发工具方面领先于JSON。尽管如此尽管如此工具开发,为了消除您对这一领域可能存在的困惑,下节将介绍一消除领域存在些最为成熟的JSON开发。
从Web services生成JSON输出既然JSON的首要目标是来自浏览器的信道外请求,那么浏览器请求既然我们选择REST风格(RESTful)Web服务来生成这些数据。除了用典用典我们这些型业务逻辑探究Web服务之外,还将采用特定的API把本地Java业务逻辑采用结构转化为JSON格式(详见 参考资料)。首先,下面的Java代参考下面格式码用来操纵Address对象:
// Create addressbook data structureSortedMap addressBook = new TreeMap();// Create new address entries and place in Map // (See download for Address POJO structure)Address maryLebow = new Addressaddressbook marylebow structur("5 Main Street","San Diego, CA",91912,"619-332-3452","664-223-4667"); addressBook.put("Mary Lebow",maryLebow);Address amySmith = new Address("25 H Streetaddressbook marylebow amysmith","Los Angeles, CA",95212,"660-332-3452","541-223-4667"); addressBook.put("Sally May",amySmith);Address johnKim = new Address("2343 Sugarland Drive","Houston, TX",55212addressbook sugarland amysmith,"554-332-3412","461-223-4667"); addressBook.put("John Kim",johnKim);Address richardThorn = new Address("14 68th Street","New York, NY",,12452,"212-132richardthorn addressbook johnkim-6182","161-923-4001"); addressBook.put("Richard Thorn",richardThorn);该Java结构在哪里生成并不重要(可能是在JSP、Servlet、EJBservlet 重要哪里或POJO中生成),重要的是,在REST风格Web 服务中有权使用这pojo 使用风格些数据。如下示:
// Define placeholder for JSON responseString result = new String();// Get parameter (if any) passed into application String from = request.getParameter("from");String to = request.getParameter("toresponsestr getparamet placehold");try { // Check for parameters, if passed filter address book if(from != null && to != null) { // Filter address book by initial addressBook = addressBook.subMap(fromaddressbook paramet address,to); } // Prepare the convert addressBook Map to JSON array // Array used to place numerous address entries JSONArray jsonAddressBook = new JSONArray(); // Iterate over filtered addressBook entriesjsonaddressbook addressbook jsonarrai for (Iterator iter = addressBook.entrySet().iterator(); iter.hasNext();) { // Get entry for current iteration Map.Entry entry = (Map.Entry)iter.next(); String key = (String)entry.getKeyaddressbook entryset hasnext(); Address addressValue = (Address)entry.getValue(); // Place entry with key value assigned to "name" JSONObject jsonResult = new JSONObject(); jsonResult.put("name",key); // Get and create addressaddressvalu jsonobject jsonresult structure corresponding to each key // appending address entry in JSON format to result String streetText = addressValue.getStreet(); String cityText = addressValue.getCity(); int zipText = addressValue.getZipaddressvalu correspond streettext(); JSONObject jsonAddress = new JSONObject(); jsonAddress.append("street",streetText); jsonAddress.append("city",cityText); jsonAddress.append("zip",zipText); jsonResult.put("address",jsonAddress); // Get and create telephone structurejsonaddress jsonobject jsonresult corresponding to each key // appending telephone entries in JSON format to result String telText = addressValue.getTel(); String telTwoText = addressValue.getTelTwo(); JSONArray jsonTelephones = new JSONArray(); jsonTelephonesjsontelephon addressvalu correspond.put(telText); jsonTelephones.put(telTwoText); jsonResult.put("phoneNumbers",jsonTelephones); // Place JSON address entry in global jsonAddressBook jsonAddressBook.put(jsonResult); } // end loop over address book // Assignjsonaddressbook jsontelephon teltwotext JSON address book to result String result = new JSONObject().put("addressbook",jsonAddressBook).toString(); } catch (Exception e) { // Error occurred }为了便于说明,我们已将这段代码将置入JSP(restservice.jsp)中restservic 说明我们。如果它真是一段程序,那么类似这样的代码也会出现在这样代码程序servlet或helper类中。 REST风格Web服务首先提取两个通过URL请求传递servlet helper 风格给它的输入参数,根据这些值过滤现有的地址簿以适应请参数过滤这些求。过滤过地址簿后,即可开始循环检查Java映射中的每个即可过滤检查条目。
您会注意到,在循环内部,json.org API被广泛用于将本地注意循环内部Java格式转化为JSON字符串。虽然仅使用了少量类(即JSONArray和JSONObjectjsonobject jsonarrai 字符串),但API提供的转换方法相当广泛,甚至能将XML结构转换相当方法转换成JSON输出。但回到我们的Web服务,一旦循环遍历了所有条我们循环 json目,那么变量“result”会包含准备返回给请求方的地址簿的result 请求变量JSON同等部分。
既然已经生成了JSON输出,下面来看看等式的另一边:下面既然已经浏览器应用程序中JSON有效负载的使用。
JSON有效负载的使用作为基于浏览器的客户端,我们的设计中大部分工作浏览器大部分基于都是在HTML、JavaScript加上附加的JavaScript 框架下完成的。例如利用Prototype库javascript prototyp 附加轻松创建跨浏览器样式的Ajax调用。下面的清单包含了我们浏览器下面我们的应用程序的第一部分,以及相应的JavaScript函数。
<html> <head> <title> JSON Address Book </title> <script type="text/javascript" src="prototype-1.4.0address book json.js"></script> <script type="text/javascript"> // Method invoked when user changes letter rangefunction searchAddressBook(){ // Select values from HTML select listsjs var fromLetter = $F('fromLetter'); var toLetter = = $F('toLetter'); // Prepare parameters to send into REST web service var pars = 'from=' fromLetter '&to=' toLetter; // Define RESTfromlett paramet servic web service URL var url = 'restservice.jsp'; // Make web service Ajax request via prototype helper, // upon response, call showResponse method new Ajax.Request( url, { methodshowrespons restservic prototyp: 'get', parameters: pars, onComplete: showResponse });}</script> </head>首先导入了prototype库,该库用于促进对REST风格Web服务的Ajaxprototyp 促进风格调用。接下来是searchAddressBook()函数,当用户修改其下所示的HTML选择列调用选择函数表时,将会触发此函数。该函数被触发后,用户将会获得函数用户触发HTML选择列表中已选中的选项,并将其放入两个用于过滤地选中用于过滤址簿的变量中,随后定义一个指向REST风格服务URL restservice.jsp的附restservic 定义变量加变量。
此方法中还包括借助原型函数new Ajax.Request( url, { method: 'get', parameters: pars, onComplete: showResponseshowrespons oncomplet request }); 的实际Ajax Web服务调用;表明了对相关URL的一个请求,其请请求表明调用求参数包含在pars中;最后一旦Ajax请求终止,即执行showResponse()。
下面以showResponse()为例说明用于评估JSON有效负载并将其放入HTMLshowrespons 用于有效主体布局环境中的的必要代码。
// Method invoked when page receives Ajax response from REST web service function showResponse(originalRequest){ // Get JSON values jsonRaw = originalRequest.responseText; // Eval JSON response into variableoriginalrequest responsetext showrespons jsonContent = eval("(" jsonRaw ")"); // Create place holder for final response finalResponse = "<b>" jsonContent.addressbook.length " matches found in range</b><brfinalrespons addressbook jsoncont/>"; // Loop over address book length. for (i = 0; i < jsonContent.addressbook.length; i ) { finalResponse = "<hr/>"; finalResponse = "<i>Name:<finalrespons address length;/i> " jsonContent.addressbook[i].name "<br/>"; finalResponse = "<i>Address:</i> " jsonContent.addressbook[i].address.street " -- " jsonContent.addressbook[ifinalrespons addressbook jsoncont].address.city "," jsonContent.addressbook[i].address.zip ".<br/>"; finalResponse = "<i>Telephone numbers:</i> " jsonContent.addressbook[i].phoneNumbers[0] " &finalrespons addressbook phonenumb; " jsonContent.addressbook[i].phoneNumbers[1] "."; } // Place formatted finalResponse in div element document.getElementById("addressBookResults").innerHTML = finalResponse; }此方法的输入参数是REST风格Web服务在调用时返回的响参数方法调用应。既然预先已经知道需要处理JSON字符串,那么可以利用字符串既然利用JavaScript eval()函数,将这个JSON字符串放入内存,并允许数据访问,javascript 字符串访问正是这样的简便性促使开发人员使用JSON。完全不需要进行这样开发进行解析,一个简单的eval()即可得到JavaScript结构,我们可以像操纵其javascript 即可我们他任何JavaScript结构一样地去操纵它。
一旦JSON响应经过eval处理,将创建一个JavaScript循环来提取每javascript 一旦 eval个地址条目,并将各个匹配项放入一个名为finalResponse的容器变量finalrespons 匹配容器中。而这个容器变量本身包含所有必要的格式,用于在页格式变量容器面布局中显示最终地址簿。循环结束时,匹配项也通过documentdocument 显示匹配.getElementById("addressBookResults").innerHTML放置完毕。
最后,为了保持完整,页面的实际布局由这些代码组最后这些代码成:
<body> <h4>Request address book matches:</h4><table cellpadding="15"><tr><td valign="top">From:<br/><select size="15" onchange="searchAddressBook()"><cellpad from 15;option>A</option>...<option>Z</option></select></td><td valign="top">Tooption zto:<br/><select size="15" onchange="searchAddressBook()"><option>A</option>...<option>Z</optionoption zz></select></td><td valign="top"><h5> Results </h5> <div>Please select range</div></td></tr></table></body>上面的代码清单中最值得一提的是HTML选择列表,因为值得一提选择代码修改触发器Java程序需要调用信道外Ajax请求。其次,<div>触发器请求信道;元素就是放置格式化后的JSON响应的地方。  格式化地方放置;  nbsp;  nbsp;
JSON适合您吗就像在软件设计中编程语言的选择一样,JSON的选择与软件编程选择否取决于您自身的需求。如果Web services使用者将在传统、功能完备的编程环境(如Java 、.NET、PHP、Ruby等)环境编程传统中创建,那么完全可以不使用JSON。给定大多数编程语言环大多数给定编程境的无限制能力可提供完整的配置控制权(更不必说对定控制权配置限制制库、分析器或helper类的访问),那么JSON与XML及其他Web services有servic helper 分析器效载荷之间的差别可以忽略不计。
反之,如果Web services使用者被限制在浏览器环境之外,那么JSON是值得认真考虑的对象浏览器环境限制。 在浏览器中使用Web services并非兴趣使然,而是实际业务需求servic 浏览器业务。如果这时需要一个加载数据时不会出现延迟/刷新的“漂延迟刷新需要亮的Web 2.0界面”, 就不得不在浏览器中嵌入Ajax和Web services技servic 不得不浏览器术。
在这种情况下,您不仅受限于通过网络访问处理环境环境访问这种,而且还会受到随机用户的限制,迫使经验丰富的开发人开发限制迫使员用最普遍的工具在浏览器中处理文本,例如:前述的DOM浏览器工具例如,与访问JSON树相比,DOM使用起来非常困难。
示例代码您可下载与本文相关的代码。
json_addressbook.zip——示例代码和实用工具安装之前先解压下载得到的文件,将addressbook.html,prototype-1.4.0.jsaddressbook prototyp 得到和restservice.jsp放入任意程序的目录下。将内含的json.jar复制到所选restservic 程序 json程序的/WEB-INF/lib目录下。访问<yourhost>/<yourappdir>/addressbook.html,并在HTML列addressbook 访问目录表中进行选择。一切就绪,可以运行JSON了!
结束语尽管 “Ajax”中的“x”代表XML,Web services也通过坚持使用servic 坚持尽管XML格式而成为主流,但这并不意味着这种方式无懈可击。无懈可击这种格式在文本处理方面,XML在Ajax程序的应用中已经暴露出一些缺暴露应用已经点。在这种情形下,JSON逐渐成为引人注目的XML替代方案。引人注目方案这种
通过对JSON语法优缺点的论述,以及对如何从REST风格Web优缺点如何以及 services创建JSON输出、如何将其嵌入Web页面布局等问题的介绍,servic 如何嵌入您现在应该能够为最终用户提供支持JSON的Web services,接触当前servic 能够当前提供的大量利用这一极具前途的格式的Web services。
参考资料 Ajax简介(David Teare,Dev2Dev,2005年8月)——介绍Ajax的相关技术背景david 技术 2005JSON in Java——介绍使用Java API将本地Java结构转换成JSON输出Prototype——介绍用于创建Ajax应用程序的JavaScript框架JSON.org——JSON主页,其中包含可生成JSON的各种语言库的资源和链各种资源主页接