`
dxp4598
  • 浏览: 82978 次
  • 来自: 上海
社区版块
存档分类
最新评论

转载:Json简介

阅读更多


本文来自:http://dev2dev.bea.com.cn/techdoc/2007/03/java-soa-introduction-json.html


摘要

  XML——这种用于表示客户端与服务器间数据交换有效负载的格式,几乎已经成了Web services的同义词。然而,由于Ajax和REST技术的出现影响了应用程序架构,这迫使人们开始寻求`XML的替代品,如:JavaScript Object Notation(JSON)。

  JSON 作为一种更轻、更友好的 Web services客户端的格式(多采用浏览器的形式或访问 REST风格 Web服务的Ajax应用程序的形式)引起了 Web 服务供应商的注意。

  本文将阐述JSON在Web services设计中备受推崇的原因,以及它作为XML替代方案的主要优势和局限性。文中还会深入探讨:随着相应的Web 服务客户端选择使用JSON,如何才能便捷地在Java Web services中生成JSON输出。

XML的十字路口: 浏览器和 Ajax

  XML设计原理已经发布了将近十年。时至今日,这种标记语言已经在广阔的软件应用领域中占据了主导地位。从Java、.NET等主流平台中的配置和部署描述符到应用集成场景中更复杂的应用,XML与生俱来的语言无关性使之在软件架构师心目中占据着独特的地位。但即便最著名的XML权威也不得不承认:在某些环境中,XML的使用已经超出了它自身能力的极限。

  围绕Ajax原理构建的那些Web应用程序最能说明XML的生存能力,从这一点来看,一种新的有效负载格式的发展壮大也得益于XML。这种新的有效负载格式就是JavaScript Object Notation (JSON)。在探索这种新的标记语言的复杂性之前,首先来分析一下在这种独特的设计形式中,XML具有哪些局限性。

  Ajax建立了一个用于从远程Web services发送和接收数据的独立信道,从而允许Web程序执行信道外(out-of-band)客户端/服务器调用。通俗地说,Ajax程序中的更新和导航序列在典型的客户端/服务器环境之外完成,在后台(即信道外)接受到信息后,必须进行一次完整的屏幕刷新。更多背景信息,请参阅David Teare的 Ajax简介 (Dev2Dev)。

  这些应用程序更新通常是通过REST风格(RESTful)Web services获得的,一旦被用户的浏览器接收到,就需要整合到HTML页面的总体布局之中,这正是XML发挥强大力量的场合。尽管近年来,脚本语言支持和插件支持已使大多数主流浏览器的功能得到了强化,但许多编程任务依然难于开展,其中之一就是操纵或处理文本,这通常是使用DOM实现的。

  采用DOM的复杂性源于其基于函数的根,这使得对数据树的简单修改或访问都需要进行无数次方法调用。此外,众所周知,DOM在各种浏览器中的实现细节不尽相同,这一过程将带来极为复杂的编程模式,其跨浏览器兼容性出现问题的可能性极大。接下来的问题显而易见,那就是:如何使一种标记语言轻松集成到HTML页面中以满足Ajax的要求?

  问题的答案就是:利用所有主流浏览器中的一种通用组件——JavaScript引擎。XML需要使用DOM之类的机制来访问数据并将数据整合到布局之中,采用这种方法,我们不再使用像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>
    <city zip="91912"> San Diego, CA </city>
    <phoneNumbers>
      <phone>619 332-3452</phone>
      <phone>664 223-4667</phone>
    </phoneNumbers>
 </address>
</addressbook>

  是不是很相似?但它们并不相同。下面将详细阐述采用JSON句法的优点和不足。

优点

  乍看上去,使用JSON的数据分隔符的优点可能并不那么明显,但存在一个根本性的缘由:它们简化了数据访问。使用这些数据分隔符时, JavaScript引擎对数据结构(如字符串、数组、对象)的内部表示恰好与这些符号相同。

  这将开创一条比DOM技术更为便捷的数据访问途径。下面列举几个JavaScript代码片段来说明这一过程,这些代码片段会访问先前的JSON代码片段中的信息:

  • 访问JSON中的名称: addressbook.name
  • 访问JSON中的地址: addressbook.address.street
  • 访问JSON中的电话号码第一位:addressbook.address.phoneNumbers[0]

  如果您具备DOM编程经验,就能很快地看出区别;新手可以参看 Document Object Model 的这一外部资源,这里提供了关于数据导航的实例。

  JSON的另一个优点是它的非冗长性。在XML中,打开和关闭标记是必需的,这样才能满足标记的依从性;而在JSON中,所有这些要求只需通过一个简单的括号即可满足。在包含有数以百计字段的数据交换中,传统的XML标记将会延长数据交换时间。目前还没有正式的研究表明JSON比XML有更高的线上传输效率;人们只是通过简单的字节数比较发现,对于等效的JSON和XML有效负载,前者总是小于后者。至于它们之间的差距有多大,特别是在新的 XML压缩格式下它们的差距有多大,有待进一步的研究。

  此外,JSON受到了擅长不同编程语言的开发人员的青睐。这是因为无论在Haskell 中或 Lisp 中,还是在更为主流的C#和PHP中,开发都可以方便地生成JSON(详见 参考资料)。

不足

  和许多好东西都具有两面性一样,JSON的非冗长性也不例外,为此JSON丢失了XML具有的一些特性。命名空间允许不同上下文中的相同的信息段彼此混合,然而,显然在JSON中已经找不到了命名空间。JSON与XML的另一个差别是属性的差异,由于JSON采用冒号赋值,这将导致当XML转化为JSON时,在标识符(XML CDATA)与实际属性值之间很难区分谁应该被当作文本考虑。

  另外,JSON片段的创建和验证过程比一般的XML稍显复杂。从这一点来看,XML在开发工具方面领先于JSON。尽管如此,为了消除您对这一领域可能存在的困惑,下节将介绍一些最为成熟的JSON开发。

从Web services生成JSON输出

  既然JSON的首要目标是来自浏览器的信道外请求,那么我们选择REST风格(RESTful)Web服务来生成这些数据。除了用典型业务逻辑探究Web服务之外,还将采用特定的API把本地Java结构转化为JSON格式(详见参考资料)。首先,下面的Java代码用来操纵Address对象:

// Create addressbook data structure
SortedMap addressBook = new TreeMap();

// Create new address entries and place in Map 
// (See download for Address POJO structure)
Address maryLebow = new Address("5 Main Street","San Diego, CA",91912,"619-332-3452","664-223-4667"); 
addressBook.put("Mary Lebow",maryLebow);

Address amySmith = new Address("25 H Street","Los Angeles, CA",95212,"660-332-3452","541-223-4667"); 
addressBook.put("Sally May",amySmith);

Address johnKim = new Address("2343 Sugarland Drive","Houston, TX",55212,"554-332-3412","461-223-4667"); 
addressBook.put("John Kim",johnKim);

Address richardThorn = new Address("14 68th Street","New York, NY",,12452,"212-132-6182","161-923-4001"); 
addressBook.put("Richard Thorn",richardThorn);

  该Java结构在哪里生成并不重要(可能是在JSP、Servlet、EJB或POJO中生成),重要的是,在REST风格Web 服务中有权使用这些数据。如下示:

// Define placeholder for JSON response
String result = new String();

// Get parameter (if any) passed into application 
String from = request.getParameter("from");
String to = request.getParameter("to");

try { 
    // Check for parameters, if passed filter address book 
    if(from != null && to != null) { 
      // Filter address book by initial 
      addressBook = addressBook.subMap(from,to);
    } 

   // Prepare the convert addressBook Map to JSON array 
   // Array used to place numerous address entries 
   JSONArray jsonAddressBook = new JSONArray();
 
   // Iterate over filtered addressBook entries 
   for (Iterator iter = addressBook.entrySet().iterator(); iter.hasNext();)  { 

     // Get entry for current iteration        
     Map.Entry entry = (Map.Entry)iter.next();
     String key = (String)entry.getKey();
     Address addressValue = (Address)entry.getValue();

     // Place entry with key value assigned to "name" 
     JSONObject jsonResult = new JSONObject();
     jsonResult.put("name",key);

     // Get and create address structure corresponding to each key 
     // appending address entry in JSON format to result 
     String streetText = addressValue.getStreet();
     String cityText = addressValue.getCity();
     int zipText = addressValue.getZip();
     JSONObject jsonAddress = new JSONObject();
     jsonAddress.append("street",streetText);
     jsonAddress.append("city",cityText);
     jsonAddress.append("zip",zipText);
     jsonResult.put("address",jsonAddress);

     // Get and create telephone structure corresponding to each key 
     // appending telephone entries in JSON format to result 
     String telText = addressValue.getTel();
     String telTwoText = addressValue.getTelTwo();
     JSONArray jsonTelephones = new JSONArray();
     jsonTelephones.put(telText);
     jsonTelephones.put(telTwoText);
     jsonResult.put("phoneNumbers",jsonTelephones);


     // Place JSON address entry in global jsonAddressBook 
     jsonAddressBook.put(jsonResult);
   } // end loop over address book 

     // Assign JSON address book to result String  
     result = new JSONObject().put("addressbook",jsonAddressBook).toString();

  } catch (Exception e) { 
     // Error occurred      
  }

  为了便于说明,我们已将这段代码将置入JSP(restservice.jsp)中。如果它真是一段程序,那么类似这样的代码也会出现在 servlet或helper类中。 REST风格Web服务首先提取两个通过URL请求传递给它的输入参数,根据这些值过滤现有的地址簿以适应请求。过滤过地址簿后,即可开始循环检查 Java映射中的每个条目。

  您会注意到,在循环内部,json.org API被广泛用于将本地Java格式转化为JSON字符串。虽然仅使用了少量类(即JSONArray和JSONObject),但API提供的转换方法相当广泛,甚至能将XML结构转换成JSON输出。但回到我们的Web服务,一旦循环遍历了所有条目,那么变量“result”会包含准备返回给请求方的地址簿的JSON同等部分。

  既然已经生成了JSON输出,下面来看看等式的另一边:浏览器应用程序中JSON有效负载的使用。

JSON有效负载的使用

  作为基于浏览器的客户端,我们的设计中大部分工作都是在HTML、JavaScript加上附加的JavaScript 框架下完成的。例如利用Prototype库轻松创建跨浏览器样式的Ajax调用。下面的清单包含了我们的应用程序的第一部分,以及相应的 JavaScript函数。

<html> 
<head> 
<title> JSON Address Book </title> 
<script type="text/javascript" src="prototype-1.4.0.js"></script> 
<script type="text/javascript"> 
// Method invoked when user changes letter range
function searchAddressBook()	{

  // Select values from HTML select lists
  var fromLetter = $F('fromLetter');
  var toLetter = = $F('toLetter');

  // Prepare parameters to send into REST web service
  var pars = 'from=' + fromLetter + '&to=' + toLetter;
  // Define REST web service URL 
  var url = 'restservice.jsp';

  // Make web service Ajax request via prototype helper, 
  // upon response, call showResponse method		
  new Ajax.Request( url, { method: 'get', parameters: pars, 
                           onComplete: showResponse });
}

</script> 
</head>

  首先导入了prototype库,该库用于促进对REST风格Web服务的Ajax调用。接下来是searchAddressBook()函数,当用户修改其下所示的HTML选择列表时,将会触发此函数。该函数被触发后,用户将会获得HTML选择列表中已选中的选项,并将其放入两个用于过滤地址簿的变量中,随后定义一个指向REST风格服务URL restservice.jsp的附加变量。

  此方法中还包括借助原型函数new Ajax.Request( url, { method: 'get', parameters: pars, onComplete: showResponse }); 的实际Ajax Web服务调用;表明了对相关URL的一个请求,其请求参数包含在pars中;最后一旦Ajax请求终止,即执行showResponse()。

  下面以showResponse()为例说明用于评估JSON有效负载并将其放入HTML主体布局环境中的的必要代码。

// Method invoked when page receives Ajax response from REST web service 
function showResponse(originalRequest)	{
   // Get JSON values 
   jsonRaw = originalRequest.responseText;
   // Eval JSON response into variable 
   jsonContent = eval("(" + jsonRaw + ")");

   // Create place holder for final response    
   finalResponse = "<b>" + jsonContent.addressbook.length + 
                   " matches found in range</b><br/>";

   // Loop over address book length.
   for (i = 0; i < jsonContent.addressbook.length; i++) {
        finalResponse += "<hr/>";
        finalResponse += "<i>Name:</i> " + jsonContent.addressbook[i].name + "<br/>";          
        finalResponse += "<i>Address:</i> " + jsonContent.addressbook[i].address.street + " -- " + 
                          jsonContent.addressbook[i].address.city + "," +           
                          jsonContent.addressbook[i].address.zip + ".<br/>";          
        finalResponse += "<i>Telephone numbers:</i> " + jsonContent.addressbook[i].phoneNumbers[0] + " & " + 
        jsonContent.addressbook[i].phoneNumbers[1] + ".";          
   }

   // Place formatted finalResponse in div element
   document.getElementById("addressBookResults").innerHTML = finalResponse;
 }

  此方法的输入参数是REST风格Web服务在调用时返回的响应。既然预先已经知道需要处理JSON字符串,那么可以利用JavaScript eval()函数,将这个JSON字符串放入内存,并允许数据访问,正是这样的简便性促使开发人员使用JSON。完全不需要进行解析,一个简单的eval ()即可得到JavaScript结构,我们可以像操纵其他任何JavaScript结构一样地去操纵它。

  一旦JSON响应经过eval处理,将创建一个JavaScript循环来提取每个地址条目,并将各个匹配项放入一个名为 finalResponse的容器变量中。而这个容器变量本身包含所有必要的格式,用于在页面布局中显示最终地址簿。循环结束时,匹配项也通过 document.getElementById("addressBookResults").innerHTML放置完毕。

  最后,为了保持完整,页面的实际布局由这些代码组成:

<body> 
<h4 style="text-align:left">Request address book matches:</h4>
<table style="text-align:left" cellpadding="15"><tr><td valign="top">From:<br/>
<select id="fromLetter" size="15" onchange="searchAddressBook()">
	<option>A</option>
	...
	<option>Z</option>
</select>
</td><td valign="top">To:<br/>
<select id="toLetter" size="15" onchange="searchAddressBook()">
	<option>A</option>
	...
	<option>Z</option>
</select>
</td><td valign="top">
<h5> Results </h5> 
<div style="text-align:left" id="addressBookResults">Please select range</div>
</td></tr>
</table>
</body> 

  上面的代码清单中最值得一提的是HTML选择列表,因为修改触发器Java程序需要调用信道外Ajax请求。其次,<div>元素就是放置格式化后的JSON响应的地方。                                                                           

JSON适合您吗

  就像在软件设计中编程语言的选择一样,JSON的选择与否取决于您自身的需求。如果Web services使用者 将在传统、功能完备的编程环境(如Java 、.NET、PHP、Ruby等)中创建,那么完全可以不使用JSON。给定大多数编程语言环境的无限制能力可提供完整的配置控制权(更不必说对定制库、分析器或helper类的访问),那么JSON与XML及其他Web services有效载荷之间的差别可以忽略不计。

  反之,如果Web services使用者 被限制在浏览器环境之外,那么JSON是值得认真考虑的对象。在浏览器中使用Web services并非兴趣使然,而是实际业务需求。如果这时需要一个加载数据时不会出现延迟/刷新的“漂亮的Web 2.0界面”, 就不得不在浏览器中嵌入Ajax和Web services技术。

  在这种情况下,您不仅受限于通过网络访问处理环境,而且还会受到随机用户的限制,迫使经验丰富的开发人员用最普遍的工具在浏览器中处理文本,例如:前述的DOM,与访问JSON树相比,DOM使用起来非常困难。

示例代码

  您可下载与本文相关的代码。

  安装之前先解压下载得到的文件,将addressbook.html,prototype-1.4.0.js和restservice.jsp 放入任意程序的目录下。将内含的json.jar复制到所选程序的/WEB-INF/lib目录下。访问<yourhost>/< yourappdir>/addressbook.html,并在HTML列表中进行选择。一切就绪,可以运行JSON了!

结束语

  尽管 “Ajax”中的“x”代表XML,Web services也通过坚持使用XML格式而成为主流,但这并不意味着这种方式无懈可击。在文本处理方面,XML在Ajax程序的应用中已经暴露出一些缺点。在这种情形下,JSON逐渐成为引人注目的XML替代方案。

  通过对JSON语法优缺点的论述,以及对如何从REST风格Web services创建JSON输出、如何将其嵌入Web页面布局等问题的介绍,您现在应该能够为最终用户提供支持JSON的Web services,接触当前提供的大量利用这一极具前途的格式的Web services。

参考资料

  • Ajax简介 (David Teare,Dev2Dev,2005年8月)——介绍Ajax的相关技术背景
  • JSON in Java ——介绍使用Java API将本地Java结构转换成JSON输出
  • Prototype ——介绍用于创建Ajax应用程序的JavaScript框架
  • JSON.org ——JSON主页,其中包含可生成JSON的各种语言库的资源和链接

 

分享到:
评论

相关推荐

    浅谈ios中的json解析(转载)

    print("Error parsing JSON: \(error.localizedDescription)") } ``` 2. 第三方库如`SwiftyJSON`提供了一种更加简洁的方式来处理JSON。安装`SwiftyJSON`可以通过CocoaPods或Swift Package Manager。使用`...

    阿里json包

    1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject:fastJson提供的json对象 3.JSONArray:fastJson提供json数组对象 --------------------- 作者:superlovelei 来源:...

    转载 xStream完美转换XML、JSON

    标题 "xStream完美转换XML、JSON" 指的是使用xStream库在Java中进行XML与JSON数据格式之间的转换。xStream是一个强大的库,它提供了一种简单的方式来序列化和反序列化Java对象到XML,反之亦然。在这个场景中,它同样...

    【RPA之家转载视频教程3】RPA快速提示-使用JSON对象管理器包处理JSON.rar

    在本RPA(Robotic Process Automation)视频教程中,我们将深入探讨如何利用JSON对象管理器包来处理JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web服务和自动化流程中,...

    Json-RPC for java Example

    json-rpc-for-java,是仅仅不到100行的javascript代码和不到10个java文件实现的超级轻量级...声明纯属学习用转载: 最新的资源,请到http://code.google.com/p/json-rpc-for-java/source/browse/#svn/trunk进行免费下载

    【RPA之家转载AA视频教程】17.Extract JSON .rar

    在这个名为“【RPA之家转载AA视频教程】17.Extract JSON .rar”的压缩包文件中,包含了一个视频教程,该教程聚焦于使用Automation Anywhere(AA)平台进行RPA(Robotic Process Automation)操作,特别是如何从REST ...

    Jquery + Json 无刷新分页

    Ajax无刷新分页(jQuery+Json) 做了一个用jQuery来实现的用户控件,VS2008+Access ...每页显示的记录条数在config里面设置(转载人标注:config里配置只是为了方面,也可在后台设置) 作者:刘巨

    json转exceljson转excel

    java实现json文件到excel文件的转换的工具类。欢迎转载

    【RPA之家转载AA视频教程】16.Extract JSON .rar

    在本资源中,我们关注的是一个关于RPA(Robotic Process Automation)的视频教程,具体章节为“16.Extract JSON”。这个视频是AA(Automation Anywhere)平台的A2019版本的教学内容,主要讲解如何从REST Web服务响应...

    【RPA之家转载AA视频教程】18.Extract JSON .rar

    【RPA之家】提供的【RPA之家转载AA视频教程】18.Extract JSON .rar教程主要聚焦于如何在Automation Anywhere(AA)平台中提取JSON数据。Automation Anywhere是一款广泛使用的机器人流程自动化(RPA)工具,它允许...

    JSON at Work epub

    JSON at Work 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    JavaScript JSON Cookbook epub

    JavaScript JSON Cookbook 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    JavaScript JSON Cookbook mobi

    JavaScript JSON Cookbook 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    JSON Quick Syntax Reference 无水印pdf

    JSON Quick Syntax Reference 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者...

    Python、Json和Seaborn可视化展示电影实体(源码)

    前文介绍了Python3抓取电影实体知识,这篇文章主要讲解Python+Seaborn可视化展示电影信息,它首先需要通过文件读取获取JSON所需数据,再绘制相关图形。这是一系列基础性文章,希望对您有所帮助 ,尤其是对知识图谱感...

    Echarts省市区JSON数据

    在Echarts中,有时候我们需要根据中国各省份、城市、区县的数据进行地图的绘制,这时就需要用到“Echarts省市区JSON数据”。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,...

    XML and JSON Recipes for SQL Server A Problem-Solution Approach epub

    XML and JSON Recipes for SQL Server A Problem-Solution Approach 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书

    2022天池商品标志目标检测

    基于json划分本地train val : #10 LogDetMini数据集 下载地址: https://pan.baidu.com/s/1fg9IaPh061iD7w5aiIX3qg?pwd=m3gm 简单介绍: 从openbrand数据模拟复赛分布,随机选取了50类,每类20张作为train, 20张作为...

    coco2017-panoptic-annotations-trainval2017.zip

    panoptic_train2017.json panoptic_val2017.json 这里面就是那92类的stuff,用于全景分割任务(不同的一类物体区分出来),请与5.2作对比,可视化如下: ———————————————— 版权声明:本文为CSDN...

    Java XML and JSON 无水印pdf

    Java XML and JSON 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

Global site tag (gtag.js) - Google Analytics