<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[]]></title>
  <subtitle type="html"><![CDATA[追意|做爱做的事：高清设计，无码开发，诱惑的作品，傲人的体验。关注设计，专注flash。Flash开发工程师，Flash设计师，web设计开发工程师]]></subtitle>
  <id>http://www.jovey.net/blog/</id>
  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.jovey.net/blog/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2010-07-08T16:37:07+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[三维专业名词 贴图处理、材质影像过滤处理、着色处理]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=23" label="视觉设计" /> 
	  <updated>2010-07-08T16:37:07+08:00</updated>
	  <published>2010-07-08T16:37:07+08:00</published>
		  <summary type="html"><![CDATA[在学三维软件和pv3d的过程中会遇到很重要的几个名词。<br/><br/>　　Texture Mapping (纹理贴图) <br/>　　在物体着色方面最引人注意、也是最拟真的方法，同时也多为目前的游戏软件所采用。一张平面图像（可以是数字化图像、小图标或点阵位图）会被贴到多边形上。例如，在赛车游戏的开发上，可用这项技术来绘制轮胎胎面及车体着装。 <br/><br/>　　Mip Mapping (Mip贴图) <br/>　　这项材质贴图的技术，是依据不同精度的要求，而使用不同版本的材质图样进行贴图。例如：当物体移近使用者时，程序会在物体表面贴上较精细、清晰度较高的材质图案，于是让物体呈现出更高层、更加真实的效果；而当物体远离使用者时，程序就会贴上较单纯、清晰度较低的材质图样，进而提升图形处理的整体效率。LOD(细节水平)是协调纹理像素和实际像素之间关系的一个标准。一般用于中、低档显卡中。 <br/><br/><br/>　　Bump Mapping (凹凸贴图) <br/>　　这是一种在3D场景中模拟粗糙外表面的技术。将深度的变化保存到一张贴图中，然后再对3D模型进行标准的混合贴图处理，即可得到具有凹凸感的表面效果。一般这种特效只有高档显示卡支持。（注：GeForce256支持的只是显示和演算该效果，不是生成特效） <br/><br/>　　Video Texture Mapping ( 视频材质贴图) <br/>　　这是目前最好的材质贴图效果。具有此种功能的图形图像加速卡，采用高速的图像处理方式，将一段连续的图像（可能是即时运算或来自一个AVI或MPEG的档案）以材质的方法处理，然后贴到3D物件的表面上去。 <br/><br/>　　Texture Map Interpolation (材质影像过滤处理) <br/>　　当材质被贴到屏幕所显示的一个3D模型上时，材质处理器必须决定哪个图素要贴在哪个像素的位置。由于材质是2D图片，而模型是3D物件，所以通常图素的范围与像素范围不会是恰好相同的。此时要解决这个像素的贴图问题，就得用插补处理的方式来解决。<br/>　　这种处理的方式共分三种：“近邻取样”、“双线过滤”、“三线过滤”以及“各向异性过滤”。 <br/><br/>　　1.Nearest Neighbor (近邻取样) <br/>　　又被称为Point sampling(点取样)，是一种较简单材质影像插补的处理方式。会使用包含像素最多部分的图素来贴图。换句话说就是哪一个图素占到最多的像素，就用那个图素来贴图。这种处理方式因为速度比较快，常被用于早期3D游戏开发，不过材质的品质较差。 <br/><br/>　　2.Bilinear Interpolation (双线过滤) <br/>　　这是一种较好的材质影像插补的处理方式，会先找出最接近像素的四个图素，然后在它们之间作差补效果，最后产生的结果才会被贴到像素的位置上，这样不会看到“马赛克”现象。这种处理方式较适用于有一定景深的静态影像，不过无法提供最佳品质。其最大问题在于，当三维物体变得非常小时，一种被称为Depth Aliasing artifacts(深度赝样锯齿)，也不适用于移动中的物件。 <br/><br/>　　3.Trilinear Interpolation (三线过滤) <br/>　　这是一种更复杂材质影像插补处理方式，会用到相当多的材质影像，而每张的大小恰好会是另一张的四分之一。例如有一张材质影像是512×512个图素，第二张就会是256×256个图素，第三张就会是128×128个图素等等，总之最小的一张是1×1。凭借这些多重解析度的材质影像，当遇到景深极大的场景时（如飞行模拟），就能提供高品质的贴图效果。一个“双线过滤”需要三次混合，而“三线过滤”就得作七次混合处理，所以每个像素就需要多用21/3倍以上的计算时间。还需要两倍大的存储器时钟带宽。但是“三线过滤”可以提供最高的贴图品质，会去除材质的“闪烁”效果。对于需要动态物体或景深很大的场景应用方面而言，只有“三线过滤”才能提供可接受的材质品质。 <br/><br/>　　4.Anisotropic Interpolation (各向异性过滤) <br/>　　它在取样时候，会取8个甚至更多的像素来加以处理，所得到的质量最好。 <br/><br/><br/>　　Shading(着色处理)<br/><br/>　　绝大多数的3D物体是由多边形（polygon）所构成的，它们都必须经过某些着色处理的手续，才不会以线结构（wire frame）的方式显示。这些着色处理方式有差到好,依次主要分为Flat Shading、Gouraud Shading 、Phone Shading、Scanline Renderer、Ray-Traced 。&nbsp;&nbsp;<br/><br/>　　Flat Shading (平面着色) <br/>　　也叫做“恒量着色”，平面着色是最简单也是最快速的着色方法，每个多边形都会被指定一个单一且没有变化的颜色。这种方法虽然会产生出不真实的效果，不过它非常适用于快速成像及其它要求速度重于细致度的场合,如：生成预览动画。<br/><br/>　　Gouraud Shading (高洛德着色/高氏着色) <br/>　　这种着色的效果要好得多，也是在游戏中使用最广泛的一种着色方式。它可对3D模型各顶点的颜色进行平滑、融合处理，将每个多边形上的每个点赋以一组色调值，同时将多边形着上较为顺滑的渐变色，使其外观具有更强烈的实时感和立体动感，不过其着色速度比平面着色慢得多。 <br/><br/>　　Phone Shading (补色着色) <br/>　　首先，找出每个多边形顶点，然后根据内插值的方法，算出顶点间算连线上像素的光影值，接着再次运用线性的插值处理，算出其他所有像素高氏着色在取样计算时，只顾及每个多边形顶点的光影效果，而补色着色却会把所有的点都计算进去。 <br/><br/>　　Scanline Renderer (扫描线着色) <br/>　　这是3DS MAX的默认渲染方式，它是一种基于一组连续水平线的着色方式，由于它渲染速度较快，一般被使用在预览场景中。 <br/><br/>　　Ray-Traced (光线跟踪着色) <br/>　　光线跟踪是真实按照物理照射光线的入射路径投射在物体上，最终反射回摄象机所得到每一个象素的真实值的着色算法，由于它计算精确，所得到的图象效果优质，因此制作CG一定要使用该选项。 <br/><br/>　　Radiosity (辐射着色) <br/>　　这是一种类似光线跟踪的特效。它通过制定在场景中光线的来源并且根据物体的位置和反射情况来计算从观察者到光源的整个路径上的光影效果。在这条线路上，光线受到不同物体的相互影响，如：反射、吸收、折射等情况都被计算在内。 <br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=132" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=132</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[几枚3D网站logo]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=23" label="视觉设计" /> 
	  <updated>2010-06-20T19:20:15+08:00</updated>
	  <published>2010-06-20T19:20:15+08:00</published>
		  <summary type="html"><![CDATA[几枚3D网站logo<br/><br/><img src="http://www.jovey.net/blog/attachments/month_1006/s2010620192038.jpg" border="0" alt=""/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=131" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=131</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[《音乐机械表》第三款千千静听皮肤设计。]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=23" label="视觉设计" /> 
	  <updated>2010-01-04T14:44:58+08:00</updated>
	  <published>2010-01-04T14:44:58+08:00</published>
		  <summary type="html"><![CDATA[《音乐机械表》第三款千千静听皮肤设计。<br/><img src="http://skin.qianqian.com/upimgs/091229/162413_322.jpg" border="0" alt=""/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=130" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=130</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[《ShineStyle炫播》第二款千千静听皮肤设计！]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=23" label="视觉设计" /> 
	  <updated>2009-12-15T16:15:24+08:00</updated>
	  <published>2009-12-15T16:15:24+08:00</published>
		  <summary type="html"><![CDATA[《ShineStyle炫播》第二款千千静听皮肤设计！<br/>此作品获得三等奖，<a target="_blank" href="http://skin.qianqian.com/final_star.php" rel="external">查看获奖名单</a><br/><br/>下载地址：<a href="http://skin.qianqian.com/skin_final.php?sid=132" target="_blank" rel="external">http://skin.qianqian.com/skin_final.php?sid=132</a><br/><img src="http://skin.qianqian.com/upimgs/091215/155254_367.jpg" border="0" alt=""/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=129" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=129</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[设计的第一款千千静听皮肤。]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=23" label="视觉设计" /> 
	  <updated>2009-12-09T15:55:55+08:00</updated>
	  <published>2009-12-09T15:55:55+08:00</published>
		  <summary type="html"><![CDATA[最近做的一套播放器皮肤，由于是第一次做，比较粗糙，很多想法在制作的时候没能实现。哈<br/><br/>如果有用千千静听的朋友，可以下载体验下，哈。　<br/>下载链接：<a href="http://skin.qianqian.com/skin_final.php?sid=96" target="_blank" rel="external">http://skin.qianqian.com/skin_final.php?sid=96</a><br/><br/><img src="http://skin.qianqian.com/upimgs/091209/154745_221.jpg" border="0" alt=""/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=128" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=128</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Adobe Flex开源开发框架]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=26" label="收藏借鉴" /> 
	  <updated>2009-10-26T13:22:19+08:00</updated>
	  <published>2009-10-26T13:22:19+08:00</published>
		  <summary type="html"><![CDATA[Adobe Flex及相关技术正成为RIA领域的主流。虽然Flex社区的规模还远比不上Java或Microsoft平台，但它正在Flex RIA开发者们的栽培下稳健地成长。许多开源开发框架也因此被创造出来：<br/><br/><a target="_blank" href="http://labs.adobe.com/wiki/index.php/Cairngorm" rel="external">Cairngorm</a><br/>Cairngorm是最老也最成熟的Flex框架。它现在由Adobe拥有并开源，而且被Adobe的RIA顾问服务团队大量使用。创造出Cairngorm 的Adobe Consulting团队是把设计模式框架运用到RIA开发的最早的倡导者。Cairngorm中可以看到许多在JEE世界中广泛使用的MVC相关设计模式，即使它只是一个仅用于RIA用户界面开发的微型架构框架。<br/><br/>Cairngorm被看作是企业RIA开发框架。它的分层MVC实现有助于开发出具有复杂的业务逻辑的可伸缩的RIA应用。在异步通信、事件驱动、无线程的Flex平台上，Cairngorm为构建严肃的商业应用程序提供了快速而可靠的方法。<br/><br/>Cairngorm的本质也决定了它可能不适用于小型的快速原型。Adobe说：<br/><br/>Cairngorm微架构的意图是为企业RIA开发者提供一个框架。如果你在编写一个非常简单的应用（比如程序原型），或者只有一个视图的程序，那么你应该考虑“一体化”的方案，就不必挣扎于Cairngorm所倡导的模型、视图和控制分离了。Cairngorm架构的益处在开发复杂的RIA应用的时候才能体现出来，比如有多个用例和视图，由一整个团队负责开发，以及团队中存在设计师、创意型开发者、技术型开发者等受过不同训练的成员的情形。<br/><br/><a target="_blank" href="http://puremvc.org/" rel="external">PureMVC</a><br/>它实际上是一个ActionScript. 3框架。与Cairngorm不同，它完全不依赖任何Flash、Flex或其他Adobe的AS3类。因此它可用于开发任何基于Flash或者ActionScript. 3的应用程序。<br/><br/>从PureMVC的名字中就可以看出，它是根据MVC设计模式来实现的，里面包含了三层，即模型、视图和控制器。这个框架的文档很全面，它的网站上也有很丰富的信息去帮助开发者上手。<br/><br/>由于PureMVC是纯粹用ActionScript实现的，而ActionScript是与JavaScript基于相同标准（ECMAScript）的，强类型的，完全面向对象的语言，因此PureMVC可以很容易移植到其他OO语言。而事实上也确实如此：<br/><br/>我高兴地宣布把PureMVC移植到4种语言的工作正在进行之中：AS2、C#、Java和ColdFusion，现已接近向公众公开的阶段。这样PureMVC的适用平台就扩大到了FlashLite、.NET、Windows Mobile、Silverlight、J2ME、SE、EE以及……ColdFusion:)<br/><br/>这些移植版以及许多演示程序和工具都是由一群专门投身于此项工作的贡献者们完成的，他们遍及全世界。还有许多翻译人员加入进来帮忙把PureMVC的文档翻译成其他语言，包括法语、德语、俄语、汉语和日语等等。他们不知疲倦的工作把一个简单的个人项目变成了全球化的开源成果。很快，你就会认识他们，并爱上他们高质量的工作。要是遇到了这群人中的某一位，请他喝一杯吧！<br/><br/>考虑到ActionScript（ECMAScript）连同Adobe所用的Flash引擎将被内建于下一代的Firefox，PureMVC将会成为RIA开发者们开发跨平台富应用的一件非常趁手的工具。<br/><br/><a target="_blank" href="http://www.model-glue.com/flex.cfm" rel="external">Model-Glue: Flex</a><br/>Model-Glue:Flex也是一个简单的MVC Flex框架。Joe Rinehart把他最初创作的Model-Glue for ColdFusion移植到了Flex。Model-Glue: Flex受到了好评。它的设计意图是成为一个比Cairngorm和PureMVC更轻量的框架，因此更便于快速原型和简单的Flex应用开发。<br/><br/><a target="_blank" href="http://www.servebox.com/foundry/doku.php?id=" rel="external">Foundry</a><br/>ServeBox Foundry（sbasfoundry）是为Flex 2应用程序开发而设计的ActionScript. 3 / Java框架。它根据几个设计模式而设计，还包括了一些工具，用来解决Flex 2开发中一再重现的烦人问题：Model-View同步、屏幕浏览、访问控制列表（开发中）、本地化以及标签文字外部化等等。<br/><br/>Foundry是为中大型规模的企业RIA系统开发而设计和实现的。它包含了Java公用模块，用来将Foundry Flex插件与服务器端的进程紧密集成。<br/><br/><a target="_blank" href="http://www.guasax.com/guasax/web/en/index.php" rel="external">Guasax Flex Framework</a><br/>Guasax是一个易于使用的编程框架，可实现条理清晰的，可伸缩的Flex应用程序。<br/><br/>Guasax框架在运行时依照MVC模式来处理程序的动作。Guasax的一个独特之处是它用一个XML文件来配置业务逻辑中的动作，在某些方面类似于Java Struts框架。可通过开发Guasax组件来扩展Guasax。<br/><br/><a target="_blank" href="http://osflash.org/projects/arp" rel="external">ARP</a><br/>Aral Balkan当初把ARP（Ariaware RIA Platform）作为一个ActionScript框架来开发，现在它已成为Open Source Flash项目群的一员。ARP现在支持使用ActionScript. 2和ActionScript. 3来开发Flash或Flex的RIA应用。<br/><br/>ARP可能是Flash社区中最老的框架。ARP的第一版是早在2000年用Flash 5编写的，其中一部分曾随开源的FC-Lib库发布。随后它发展到Flash MX，其中一部分又进入了开源的Moose库。由于它是从Flash框架进化而来，ARP可以在Flex和AIR中使用。ARP的代码直接访问Flash类，因此有报告说它比其他Flex框架性能更好。<br/><br/><a target="_blank" href="http://code.google.com/p/flest/" rel="external">Flest Framework</a><br/>Flest是构建企业级RIA的ActionScript3 / Flex应用程序框架。它运用了Controller、Factory、Command等设计模式。它的设计理念是高效、简单和实用。Flest框架是一个轻量级且易于使用的工具集合，不但帮助搭建开发的环境，还给开发者最大的自由去实现自己的决定。<br/><br/>除了上面列出的框架，还有一些使用不那么广泛的。你可以看一下EasyMVC、Adobe FAST和Joeberkovitz的框架。<br/><br/>除了用来开发RIA用户界面的框架，RIA开发者还有其他帮手，比如FlexUnit（ActionScript. 3的单元测试框架），FlexLib（开源Flex 2组件库），AS3CoreLib（提供了若干基本工具和出色JSON支持的ActionScript. 3.0类库），以及Granite DS（Adobe Data Services for J2EE应用服务器的免费、开源的替代品，支持EJB3/Spring/Pojo服务）。<br/><br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=127" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=127</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[blog升级新到pjblog3.0]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=1" label="生活手记" /> 
	  <updated>2009-10-23T12:01:05+08:00</updated>
	  <published>2009-10-23T12:01:05+08:00</published>
		  <summary type="html"><![CDATA[已经有N长时间没有更新blog了，最近看到网站几近荒废，准备重拾。原本想随大潮转到wordpress，但由于空间数据库等原因，还是放弃了转换的想法，不过还是把blog从pjblog2.6升级到了pjblog3.0，新皮肤也正修改调整中。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=126" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=126</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[资深玩家谈网页游戏 技术是重中之重]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=26" label="收藏借鉴" /> 
	  <updated>2009-08-07T10:20:57+08:00</updated>
	  <published>2009-08-07T10:20:57+08:00</published>
		  <summary type="html"><![CDATA[<br/>网页游戏正处于飞速发展的时期，并且网页游戏的主要客户群，上班族也被定位成为主要玩家。不用慢长的泡在游戏里，打怪升级，我想这也是多数玩家选择网页游戏的初衷吧，但是网页游戏不具备客户端网游的华丽、刺激的效果，所以一直以来人气都高不过客户端网游，针对这种问题本人有几天点想法。 <br/><br/><br/>一、针对网游玩家，网页游戏要向更加精美，更具技术含量的方向发展，这方面的成功例子有2007年全球游戏排行第二的Runscape网页游戏，其虽然作为一款网页游戏，但却是一款3D的网页游戏，这种气魄及技术含量是首屈一指的，所以技术方面是重中之重。 <br/><br/><br/>二、游戏要从题材及内容方面，向趣味性发展，增加一定的优美音乐，主要目的是希望吸引女性玩家。一方面针对性开发上班族中的女性玩家，另一方面开发女学生，因为对于女性而言，上班族与学生或者其它年轻女性，游戏的追求是一样。所以有创意有必要的话，能够开发一款同时适合女性的网页游戏，女性玩家对于游戏的推动是不言而喻的，有女性的地方，永远都不愁没有男玩家。通过一款网页游戏来积累女性玩家，这将是一笔强大的财富。 <br/><br/><br/>三、上班族之所以被定位于网页游戏的主体玩家，是因为上班族时间与行为有许多的限制，同时生活也比较压抑，偶尔需要一些放松。这种情况下，让网游玩家觉得非常粗糙及相当耗时的网页游戏，却吻合了上班族的需要。网页游戏画面在追求更加精美的同时，画面不能过暗及过浓，最好是以白色底为主。因为对于上班族而言，其有许多的顾忌，上班期间玩游戏本来就不妥，有点提心掉胆的，如果画面过于暗，颜色过于浓，上班族肯定会放弃些款游戏，这一点由游戏中部分玩家的离去原因 <br/><br/><br/>四、玩网页游戏的除了部分客户端网游玩家外，还有部分第一次接触网游的他们可以说是超级小白，连游戏怎么充值都不会，所以多接入些充值方式，可以留住不少玩家，现在多数网页游戏都接入了 “游戏支付三剑客”这样方便那些没有使用过网银购物的人群。而且对资金安全也有保障。 <br/><br/><br/>五、在网页游戏备受关注的一年里，各个网页游戏开发、运营公司在09年里会受到很多限制，立法的健全，行业的规范，等等等等，一切都在预示着，网页游戏业将面临一次改革，而这次改革中会有一批被淘汰。所以在综合策略上，网页游戏开发、运营公司会相对08年保守很多，以防止受到灭顶之灾，被市场淘汰。那么就要合理化使用资产，尽量发展自身各项品质，使自己能更容易适应行业震荡。 <br/><br/><br/>网游是一种娱乐服务，只有不断的更新服务、提高服务、扩大服务才会吸引更多的玩家，一切站在玩家的立场考虑问题，从而会获得更大的效益。 <br/><br/><br/>09年将是网页游戏真正发展的一年，从行业标准到游戏品质都会有很大的提高。而且更人性化的发展和管理游戏成为主流，这就使直接受益者变成玩家。在面对众多精品游戏的时候，玩家占据了主动权，不再是被迫无奈的玩不是很喜欢的游戏，而是有更多的选择，这一切都是去考验网页游戏开发、运营商的游戏品质。<br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=125" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=125</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[小猪的供窝记。。]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=25" label="瞎侃杂谈" /> 
	  <updated>2008-12-10T18:26:49+08:00</updated>
	  <published>2008-12-10T18:26:49+08:00</published>
		  <summary type="html"><![CDATA[猪通过勤劳致富有5元钱存在老鼠开的钱庄里。猪打算拿这5元钱建一个小窝，大概要花2元卖地，花3元搭窝。 <br/>王八是搞工程的，他想在猪身上挣更多的钱，于是找来当投资顾问的狐狸想办法。 <br/>狐狸说：这好办。于是找来管地盘的狼，开钱庄的老鼠一起来商议。 <br/>结果王八从老鼠那里借来200元，用100元买了狼的地，花了3元把猪窝盖好，花了50元给了狐狸咨询服务费。 <br/>猪没有地，只好求王八把窝卖给它，王八要价500元。 <br/>老猪说只有5元买不起，这时候狐狸说服猪去向老鼠借钱； <br/>老鼠答应借500给猪，前提是要他连本带利还600元，可以分10年还清，并且产权证拿来抵押。结果成交。 <br/>猪到最后花了600元买来了猪窝，比地价加建设成本高了11倍，猪努力了十年去挣钱还贷。 <br/>在这场交易里面，狼，老鼠，狐狸还有王八都挣了钱。以后他们就如法炮制，迫使更多的猪去贷款买房子了。 <br/>这时候，驴看到有机可乘，到老鼠那里贷了好多好多的款，把王八盖的房子都买下来，然后以更高的价格卖给了猪。猪的还贷期就越来越长，吃的越来越差，小猪崽子也不敢生了。 <br/>由于猪的数目越来越少，狼觉得这样下去自己没有猪肉吃了，非饿死不可，于是开始调控，不让老鼠再借钱了。但是王八还没有停止盖房，把自己挣的钱和贷的钱全投入生产了。驴手上的猪窝囤积的很多，卖不动了被套牢了。结果，老鼠，王八，还有驴都挣了好多的猪窝。钱到最后集中到狼手上。 <br/>如今，谁都等着狼把钱拿出来救命。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=124" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=124</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[JSON 入门指南]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2008-10-10T16:04:33+08:00</updated>
	  <published>2008-10-10T16:04:33+08:00</published>
		  <summary type="html"><![CDATA[JSON 即 JavaScript Object Natation，它是一种轻量级的数据交换格式，非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式，并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理。 <br/>尽管有许多宣传关于 XML 如何拥有跨平台，跨语言的优势，然而，除非应用于 Web Services，否则，在普通的 Web 应用中，开发者经常为 XML 的解析伤透了脑筋，无论是服务器端生成或处理 XML，还是客户端用 JavaScript 解析 XML，都常常导致复杂的代码，极低的开发效率。实际上，对于大多数 Web 应用来说，他们根本不需要复杂的 XML 来传输数据，XML 的扩展性很少具有优势，许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比，返回 HTML 片段大大降低了系统的复杂性，但同时缺少了一定的灵活性。 <br/><br/>现在， JSON 为 Web 应用开发者提供了另一种数据交换格式。让我们来看看 JSON 到底是什么，同 XML 或 HTML 片段相比，JSON 提供了更好的简单性和灵活性。<br/><strong><span style="font-size:14pt;line-height:100%;">JSON 数据格式解析 </span></strong><br/><br/>和 XML 一样，JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的，因此，JSON 的数据格式非常简单，您可以用 JSON 传输一个简单的 String，Number，Boolean，也可以传输一个数组，或者一个复杂的 Object 对象。 <br/><br/>String，Number 和 Boolean 用 JSON 表示非常简单。例如，用 JSON 表示一个简单的 String “ abc ”，其格式为：<br/><br/>&#34;abc&#34; <br/><br/><br/>除了字符 &#34;，\，/ 和一些控制符（\b，\f，\n，\r，\t）需要编码外，其他 Unicode 字符可以直接输出。<br/><br/>这与绝大多数编程语言的表示方法一致，例如：<br/><br/>12345（整数）<br/> -3.9e10（浮点数） <br/><br/><br/>Boolean 类型表示为 true 或 false 。此外，JavaScript 中的 null 被表示为 null，注意，true、false 和 null 都没有双引号，否则将被视为一个 String 。 <br/><br/>JSON 还可以表示一个数组对象，使用 [] 包含所有元素，每个元素用逗号分隔，元素可以是任意的 Value，例如，以下数组包含了一个 String，Number，Boolean 和一个 null：<br/><br/>[&#34;abc&#34;,12345,false,null] <br/><br/><br/>Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的，实际上此处的 Object 相当于 Java 中的 Map&lt;String, Object&gt;，而不是 Java 的 Class 。注意 Key 只能用 String 表示。 <br/><br/>例如，一个 Address 对象包含如下 Key-Value：<br/><br/>city:Beijing <br/> street:Chaoyang Road <br/> postcode:100025（整数） <br/><br/><br/>用 JSON 表示如下：<br/><br/>{&#34;city&#34;:&#34;Beijing&#34;,&#34;street&#34;:&#34; Chaoyang Road &#34;,&#34;postcode&#34;:100025} <br/><br/><br/>其中 Value 也可以是另一个 Object 或者数组，因此，复杂的 Object 可以嵌套表示，例如，一个 Person 对象包含 name 和 address 对象，可以表示如下：<br/><br/>{&#34;name&#34;:&#34;Michael&#34;,&#34;address&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;{&#34;city&#34;:&#34;Beijing&#34;,&#34;street&#34;:&#34; Chaoyang Road &#34;,&#34;postcode&#34;:100025}<br/>} <br/><br/><br/><strong>JavaScript 处理 JSON 数据 </strong><br/><br/>上面介绍了如何用 JSON 表示数据，接下来，我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端，以及客户端如何使用 JavaScript 处理 JSON 格式的数据。 <br/><br/>我们先讨论如何在 Web 页面中用 JavaScript 处理 JSON 数据。我们通过一个简单的 JavaScript 方法就能看到客户端如何将 JSON 数据表示给用户：<br/><br/>function handleJson() { <br/>&nbsp;&nbsp;var j={&#34;name&#34;:&#34;Michael&#34;,&#34;address&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&#34;city&#34;:&#34;Beijing&#34;,&#34;street&#34;:&#34; Chaoyang Road &#34;,&#34;postcode&#34;:100025}<br/>&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;document.write(j.name); <br/>&nbsp;&nbsp;document.write(j.address.city); <br/> } <br/><br/><br/>假定服务器返回的 JSON 数据是上文的：<br/><br/>{&#34;name&#34;:&#34;Michael&#34;,&#34;address&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;{&#34;city&#34;:&#34;Beijing&#34;,&#34;street&#34;:&#34; Chaoyang Road &#34;,&#34;postcode&#34;:100025}<br/>} <br/><br/><br/>只需将其赋值给一个 JavaScript 变量，就可以立刻使用该变量并更新页面中的信息了，相比 XML 需要从 DOM 中读取各种节点而言，JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求，然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力，例如 Prototype（一个流行的 JavaScript 库：<a href="http://prototypejs.org" target="_blank" rel="external">http://prototypejs.org</a>）提供了 evalJSON() 方法，能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量：<br/><br/>new Ajax.Request(&#34;<a href="http://url" target="_blank" rel="external">http://url</a>&#34;, { <br/>&nbsp;&nbsp;method: &#34;get&#34;, <br/>&nbsp;&nbsp;onSuccess: function(transport) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;var json = transport.responseText.evalJSON(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: document.write(json.xxx); <br/>&nbsp;&nbsp;} <br/> }); <br/><br/><br/><strong>服务器端输出 JSON 格式数据 </strong><br/><br/>下面我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例，我们将演示将一个 Java 对象编码为 JSON 格式的文本。 <br/><br/>将 String 对象编码为 JSON 格式时，只需处理好特殊字符即可。另外，必须用 (&#34;) 而非 (&#39;) 表示字符串：<br/><br/> <br/> static String string2Json(String s) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder(s.length()+20); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;\&#34;&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;s.length(); i++) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c = s.charAt(i); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (c) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\&#34;&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\\&#34;&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\\&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\\\&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;/&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\/&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\b&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\b&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\f&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\f&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\n&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\n&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\r&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\r&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\t&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\t&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(c); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;\&#34;&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>将 Number 表示为 JSON 就容易得多，利用 Java 的多态，我们可以处理 Integer，Long，Float 等多种 Number 格式：<br/><br/> <br/> static String number2Json(Number number) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;return number.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>Boolean 类型也可以直接通过 toString() 方法得到 JSON 的表示：<br/><br/> <br/> static String boolean2Json(Boolean bool) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;return bool.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>要将数组编码为 JSON 格式，可以通过循环将每一个元素编码出来：<br/><br/> <br/> static String array2Json(Object[] array) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (array.length==0) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#34;[]&#34;; <br/>&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder(array.length &lt;&lt; 4); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;[&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;for (Object o : array) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(toJson(o)); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;,&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;// 将最后添加的 &#39;,&#39; 变为 &#39;]&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.setCharAt(sb.length()-1, &#39;]&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>最后，我们需要将 Map&lt;String, Object&gt; 编码为 JSON 格式，因为 JavaScript 的 Object 实际上对应的是 Java 的 Map&lt;String, Object&gt; 。该方法如下：<br/><br/> <br/> static String map2Json(Map&lt;String, Object&gt; map) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (map.isEmpty()) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#34;{}&#34;; <br/>&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder(map.size() &lt;&lt; 4); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;{&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;String&gt; keys = map.keySet(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;for (String key : keys) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object value = map.get(key); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;\&#34;&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(key); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;\&#34;&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;:&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(toJson(value)); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;,&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;// 将最后的 &#39;,&#39; 变为 &#39;}&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.setCharAt(sb.length()-1, &#39;}&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>为了统一处理任意的 Java 对象，我们编写一个入口方法 toJson(Object)，能够将任意的 Java 对象编码为 JSON 格式：<br/><br/> <br/> public static String toJson(Object o) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o==null) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#34;null&#34;; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof String) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string2Json((String)o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Boolean) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return boolean2Json((Boolean)o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Number) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return number2Json((Number)o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Map) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return map2Json((Map&lt;String, Object&gt;)o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Object[]) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return array2Json((Object[])o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;throw new RuntimeException(&#34;Unsupported type: &#34; + o.getClass().getName()); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>我们并未对 Java 对象作严格的检查。不被支持的对象（例如 List）将直接抛出 RuntimeException 。此外，为了保证输出的 JSON 是有效的，Map&lt;String, Object&gt; 对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归，例如，精心构造一个循环引用的 Map，就可以检测到 StackOverflowException：<br/><br/> <br/> @Test(expected=StackOverflowError.class) <br/> public void testRecurrsiveMap2Json() { <br/>&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;map.put(&#34;key&#34;, map); <br/>&nbsp;&nbsp;&nbsp;&nbsp;JsonUtil.map2Json(map); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象，因此，递归引用的可能性很小。 <br/><br/>最后，通过 Servlet 或 MVC 框架输出 JSON 时，需要设置正确的 MIME 类型（application/json）和字符编码。假定服务器使用 UTF-8 编码，则可以使用以下代码输出编码后的 JSON 文本：<br/><br/> <br/> response.setContentType(&#34;application/json;charset=UTF-8&#34;); <br/> response.setCharacterEncoding(&#34;UTF-8&#34;); <br/> PrintWriter pw = response.getWriter(); <br/> pw.write(JsonUtil.toJson(obj)); <br/> pw.flush(); <br/>&nbsp;&nbsp;<br/><br/><br/>小结 <br/><br/>JSON 已经是 JavaScript 标准的一部分。目前，主流的浏览器对 JSON 支持都非常完善。应用 JSON，我们可以从 XML 的解析中摆脱出来，对那些应用 Ajax 的 Web 2.0 网站来说，JSON 确实是目前最灵活的轻量级方案。 <br/><br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=123" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=123</id>
  </entry>	
		
</feed>
