<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Moondy’s Zone &#187; JSON</title>
	<atom:link href="http://www.moondyzone.com/tag/json/feed" rel="self" type="application/rss+xml" />
	<link>http://www.moondyzone.com</link>
	<description>一位IT民工的点点滴滴……  WEB前端、网页重构、AS3</description>
	<lastBuildDate>Mon, 18 Apr 2011 10:06:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://www.moondyzone.com/wp-includes/js/jquery/jquery.js?ver=1.3.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>使用动态scritp标签解决跨域读数据的问题</title>
		<link>http://www.moondyzone.com/js/532.html</link>
		<comments>http://www.moondyzone.com/js/532.html#comments</comments>
		<pubDate>Fri, 04 Sep 2009 07:43:48 +0000</pubDate>
		<dc:creator>Moondy</dc:creator>
				<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[跨域]]></category>

		<guid isPermaLink="false">http://www.moondyzone.com/?p=532</guid>
		<description><![CDATA[来到TX后第一个比较正式的任务就是做一个活动页面。页面就不说了，活动页面嘛，那个线条啊只能大块大块地切图了。然后就是因为数据量并不多，所以采用了用静态页然后通过JS去读数据的做法。然后就碰到了跨域的问题了。
我想肯定有很多朋友也会碰到这样的情况，对方只给出一个链接让你去取数据，通过传递不同的参数，返回不同的数据。如果是在本域的话，用AJAX是很方便的，但AJAX不能跨域。而iframe的方法也不实用，只能跨小域，还需要在双方页面加相应的函数，页面里多了那么一块也让人感觉不舒服。所以决定用动态script标签的方法来解决这个问题。
在这里想说一句，国内的业内环境真是…，网上查出来的技术文章几乎都是同样的几篇转来转去，而且也说得不清不楚的很费解。还是BI上环境好些，呵呵。下面的代码并非我原创，也是参考来的，但我一定讲解清楚，让每一个看这文章的人都能明白具体是如何实现的。
由于浏览器安全的问题，一些跨域的请求都会被拒绝，当然，你也可以设置为添加到信任站点就能访问，但你不可能要求你的每个用户都去这样添加。但是，也有个例外，JS是可以跨域的，比如说我们用jquery的时候，可以加载code.google.com里面的jquery包，同样也能应用到jquery的框架；再比如说一些流量统计的代码，都是加一段JS在页面，我们就能应用到写在里面的函数了。所以，当我们把我们所以跨域读取的地址写在script标签的src里的时候，不管是什么后缀名的文件，都会被当做一个JS来读取。所以呢，这个页面的输出要采用JS的格式。
在这里先说两点，第一是这个方法名字虽然是叫动态script标签，但是你静态地直接写在页面里也是可以的，前提是你不需要动态地传递参数；第二是在很多文章里会把此方法跟json扯上关系，其实这跟json没有任何关系，只是因为用json来处理某些返回值时比较方便罢了。下面还是用json格式的来说明好了，因为这样的应用可能会比较多一点。
首先我们新建一个页面，可以是ASP、PHP或者CGI，或者TXT也都可以，但是让他的输出像这样：

var MyJSON = &#123;
   'info': &#91;&#123;'name' : 'moondy','sex' : '男','age' : '28'&#125;&#93;
&#125;;

这里定义了一个json，你也可以这样定义：

var name=&#34;moondy&#34;;
var sex=&#34;男&#34;;
var age=&#34;28&#34;;

喜欢怎样写就怎样写了，只是在有多组数据的时候，用json比较方便了。关键是要用var ，这样才能当做一个JS的变量来读取，此方法的主要思想，就是在你的页面动态地加入了一句变量的定义，而你就可以直接在JS中引用这个变量了。下面是JS部分：

var element = document.createElement&#40;&#34;script&#34;&#41;;
function createScript&#40;compId,dataId&#41;&#123;        
        element.src = &#34;http://www.moondyzone.com/json.php&#34;;//这里是你需要跨域读取的URL
        element.type = &#34;text/javascript&#34;;
      [...]]]></description>
		<wfw:commentRss>http://www.moondyzone.com/js/532.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AS3中JSON的基本应用实例</title>
		<link>http://www.moondyzone.com/as3/356.html</link>
		<comments>http://www.moondyzone.com/as3/356.html#comments</comments>
		<pubDate>Fri, 22 May 2009 16:44:22 +0000</pubDate>
		<dc:creator>Moondy</dc:creator>
				<category><![CDATA[Flash/AS3]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://www.moondyzone.com/?p=356</guid>
		<description><![CDATA[最近发现有不少通过“AS3 json”关键词搜索过来的朋友，可见还是有很多朋友对这方面关注的。不过现下有关AS3 JSON的文章是少之又少，网上搜索到的基本上也都是那同样的几篇文章转来转去罢了，也包括我之前那篇，也没什么例子。相信会让很多初学的朋友看得云里雾里的，其实我也觉得奇怪，json其实也算蛮简单的，怎么就没人写篇好的教程呢。废话就不多说了，希望转载的朋友能注明一下出处，谢了。
首先，你需要有一个JSON的类库，建议去下载adobe官方提供的产品外类库：as3corelib。类库的使用就不多说了，大家应该都知道。
先说说获取数据。可以这么说，只要你懂AS3与XML的交互，那么就一定能懂JSON，因为两者几乎是一样的，你唯一需要做的只是了解一下JSON的格式。例如下面这个JSON的例子，就像XML一样，你可以通过任何动态页面来生成这个格式，也可以通过静态的甚至TXT来读取也行。

1
2
3
4
[{&#34;name&#34;:&#34;Hans&#34;,&#34;age&#34;:&#34;32&#34;},
{&#34;name&#34;:&#34;John&#34;,&#34;age&#34;:&#34;12&#34;},
{&#34;name&#34;:&#34;Zaki&#34;,&#34;age&#34;:&#34;34&#34;},
{&#34;name&#34;:&#34;Dr. Cox&#34;,&#34;age&#34;:&#34;88&#34;}]

AS中的代码：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package &#123;
 import com.adobe.serialization.json.JSON;
&#160;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.net.URLLoader;
 import flash.net.URLRequest;
&#160;
 public class getJSON extends Sprite &#123;
  public function getJSON&#40;&#41; &#123;
   var loader:URLLoader = new URLLoader&#40;&#41;;
&#160;
   loader.load&#40;new URLRequest&#40; &#34;http://127.0.0.1/json.php&#34; &#41;&#41;;//这里是你要获取JSON的路径
   loader.addEventListener&#40;Event.COMPLETE, decodeJSON&#41;;
  &#125;
  private function decodeJSON&#40;evt:Event&#41;:void &#123;
   var persons:Array = JSON.decode&#40; URLLoader&#40; evt.target &#41;.data &#41;;
   //在这里，就可以通过操作数组来应用数据了，很方便
   for &#40;var i=0; i&#60;persons.length; i++&#41; &#123;
    trace&#40; persons&#91;i&#93;.name &#41;;
   &#125;
  &#125;
 &#125;
&#125;

是不是很简单呢？在这里我们只用到了decode()这个方法，其实JSON类库要用的也只有两个方法，另一个就是马上要用到的encode()。大家可以理解为编码与解码。发送数据的代码如下：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package &#123;
 import com.adobe.serialization.json.JSON;
&#160;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.net.*;
&#160;
 public class sendJSON extends Sprite &#123;
  public function sendJSON&#40;&#41; [...]]]></description>
		<wfw:commentRss>http://www.moondyzone.com/as3/356.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>JSON简析以及AS3中JSON类的应用</title>
		<link>http://www.moondyzone.com/as3/45.html</link>
		<comments>http://www.moondyzone.com/as3/45.html#comments</comments>
		<pubDate>Wed, 31 Dec 2008 13:44:47 +0000</pubDate>
		<dc:creator>Moondy</dc:creator>
				<category><![CDATA[Flash/AS3]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.moondyzone.com/?p=45</guid>
		<description><![CDATA[以往在做FLASH数据交互的时候，大多用的是XML，或者直接通过html传递参数来交互。前不久接触了一下JSON，研究了一下，觉得还是值得写点东西的。
json是JavaScript Object Notation的简写，是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它是基于JavaScript（Standard ECMA-262 3rd Edition &#8211; December 1999）的一个子集，也就是说他是来自于javascript的东西。因为现在ajax的流行，大部分网站会采用ajax的模式和构架，那么json会是一个数据传输的首选（文本方式太简单，要是大数据量的时候无法理解，xml的方式数据量大，在解析的时候会增加服务器负担），那么要是一个网站从ajax构架的基础上出一个flex/flash版的界面的时候使用json会最少地减少服务器端的程序改动。
JSON的结构写法很容易理解，它原本就是以数据量小和清晰的数据格式而著称的。但是在AS中使用json其实并不是一个必须或是很好的选择，很多时候我们还是会用XML，因为AS对XML的解析已经很好了。但是多了解一种数据交互形式，特别是如此简单的JSON，当然是有益无害的咯。
在这里想说些题外话，很多人喜欢拿XML跟JSON的可读性以及解析来做比较，其实一个写法优秀的XML也不会比JSON差，举个例子来说吧，现假设有一个用户数据包括：用户名、密码、所在部门、性别、年龄。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
用XML表示如下：
&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
　　&#60;user&#62;
　　&#60;name&#62;张三 &#60;/name&#62;
　　&#60;password&#62;123456&#60;/password&#62;
　　&#60;department&#62;技术部&#60;/department&#62;
　　&#60;sex&#62;男&#60;/sex&#62;
　　&#60;age&#62;30&#60;/age&#62;
　　&#60;/user&#62;
对于这样一个XML来说，如果数据量大了的确让人头昏眼花，也不好处理，但是如果我们转化成下面这种形式的话：
&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
　　&#60;user&#62;
            &#60;people name=&#34;张三&#34; password=&#34;123456&#34; depattment=&#34;技术部&#34; sex=&#34;男&#34; age=&#34;30&#34; /&#62;
　　&#60;/user&#62;
再跟相应该的JSON来比较：
{&#34;name&#34;:&#34;张三&#34;,&#34;password&#34;:&#34;123456&#34;,&#34;department&#34;:&#34;技术部&#34;,&#34;sex&#34;:&#34;男&#34;,&#34;age&#34;:&#34;30&#34;}
也不会相差太多咯。

下面再说说adobe的官方的JSON类的用法吧。
1、服务器端来的json
语法：JSON.decode(String)
从服务器端获得的应该是一个字符串，把它存入一个变量，然后通过JSON.decode(String)方法后，就可以通过点语法来访问这些值。下面是一个网络上找来的例子：

1
2
3
4
5
6
7
8
9
10
11
12
13
var serverJSON:String = '{ &#34;programmers&#34;:{ &#34;firstName&#34;: &#34;Brett&#34;, &#34;lastName&#34;:
&#34;McLaughlin&#34;, &#34;email&#34;: &#34;brett@newInstance.com&#34; }, &#34;firstName&#34;: &#34;Jason&#34;, 
&#34;lastName&#34;:&#34;Hunter&#34;, &#34;email&#34;: &#34;jason@servlets.com&#34; },  &#34;firstName&#34;: 
&#34;Elliotte&#34;, &#34;lastName&#34;:&#34;Harold&#34;, &#34;email&#34;: &#34;elharo@macfaq.com&#34; }],
&#34;authors&#34;: [...]]]></description>
		<wfw:commentRss>http://www.moondyzone.com/as3/45.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

