sban : how to use json with as3corelib in flex
摘要:本文主要介绍as3corelib如何在flex中使用,以及如何在flex中使用json。
关键词:as3corelib,json,flex3
作者:sban
原文链接:http://blog.sban.com.cn/2008/08/30/how-to-use-json-with-as3corelib-in-flex.html
一、什么是as3corelib?
as3corelib是一个开源的,免费的ActionScript3.0 Library。所用开源协议是New BSD License.它是一些实用类的集合,包括一些如md5,sha等加密算法,还有json的编码与解码,一些webapi,还有若干实用的utils classses。它是一个开发as3应用不可或缺的library。
二、从哪里可以下载:
1,从这里下载最新发布的zip包。
2,用SVN工具从开发者的源码库里下载开发版本,地址:http://as3corelib.googlecode.com/svn/trunk/, svn工具可以选择RapidSVN。
三、如何编译、使用它?
用svn获取到最新的开发版本(截止到2008/08/30)至as3corelib目录,包括examples,docs,src,tests目录。examples只包括一个json的例子。docs是用asdoc生成的,如果看源码,就不用看它了。tests是用flexunit写的测试。
学习使用as3corelib,最好是自己编码,而不是使用开发者已经编译好的swc文件。如果用flex builder 3创建library,把src文件添加进来之后,出现找不到flash.filesystem.File之类的错误,可按如下方法解决:
右键打开项目属性>Flex Library Compile>选择Include Adobe air libraries。flash.filesystem.File,与FileStream,FileMode均属于系统文件操作类,位于AIR Library中。
编译通过,一般会在bin目录生成一个swc文件。新建一个project,引用这个library。
四、JSON的使用
1,什么是JSON,JSON文件如何描述?
json(JavaScript Object Notation)是一种轻量级的文本数据描述格式,它太简单,还不足以称之为语言,但它很强大。json把相同内容的文本数据量降到最低,可谓是最轻量级,它几乎没有一个字符是多余的。它把文本数据以一种最简单的格式描述了所有的复杂。在json的描述中,除了文本之外,标识符有”{}”,”[]“,”,”,”:”,其中“{}”表示是一个对象,“[]”表示是一个并列的数组,”,”表示并列对象的分隔,“:”表示名/值对,前面为名称,后面为值。名/值对并非一定要成对出现,有时在一个数组中,便只有值,没有名了。json可以描述任何一个xml格式的文本数据。如下面这个xml文本:
<posts> <post> <id>1</id> <title>帖子1</title> <content>内容1</content> <author>sban</author> </post> <post> <id>2</id> <title>帖子2</title> <content>内容2</content> <author>sban</author> </post> </posts>
如上所示,posts是独立的一节,可视为对象用{}描述。其下有两个post,结构相同,可视为数组,用[]描述。再其下如1,可视为一个名值对。可以如下描述:
{
id:1,
title:"帖子1",
content:"内容",
author:"sban"
},
{
id:2,
title:"帖子2",
content:"内容",
author:"sban"
}
]};
真正传输中的json格式像比萨一般,结构没有那么明了。
2,如何使用as3corelib解码与编码json?
A,解码:JSON.decode(obj : Object) : String;
B,编码:JSON.encode(str : String) : Object;
注:使用之前别忘了import com.adobe.serialization.json.JSON;
decode方法的参数与encode的返回值均为Object类型,我们就可以把它理解为as3的原生的Object类型。看下面一段actionscript3.0代码:
jsonObj.name = “sban”;
jsonObj.country = “china”;
jsonObj.city = “beijing”;
jsonObj.gameinfo = “跑跑卡丁车,传奇,诛仙”;
var ajax : Object = {};
ajax.javascript = “ajax”;
var airTechs : Array = ["flex","flash","silverlight",ajax];
var techniques : Array = ["ruby","php","dotnet",airTechs];
jsonObj.techniques = techniques;
sonStringText.text = JSON.encode(jsonObj);
这段代码在创建一个Object,给它添加了一些信息。它编码之后成为:
从这个例子,可以看出并非所有都是名/值对。值有时可能是一个数组,如techniques的值,数组中也有可能再含有一个没有名称的数组,而所有名/值对的父标签都是{}。
JSON.decode的参数必须是符合json描述定义的文本。
JSON.encode效果展示:http://blog.sban.com.cn/flex/as3corelib/json_encode.html
JSON.decode效果展示:http://blog.sban.com.cn/flex/as3corelib/json.html
两者源码:http://blog.sban.com.cn/flex/as3corelib/srcview/index.html
相关资源:
1,json examples:http://www.json.org/example.html
2,json权威站点:http://www.json.org/
sban 2008年8月30日于北京朝阳园
原文链接:http://blog.sban.com.cn/2008/08/30/how-to-use-json-with-as3corelib-in-flex.html
Related Posts




xg Said on 九月 18th, 2008 at 8:06 下午 quote
sban:
你好,我下载了你的例子并测试,Grid中并不会显示数据呀,并且另外一个例子的结果也和您不一样,我的结果如下:
{”gameinfo”:”跑跑卡丁车,传奇,诛仙”,”country”:”china”,”techniques”:["ruby","php","dotnet",["flex","flash","silverlight",{"javascript":"ajax"}]],”name”:”sban”,”city”:”beijing”}
能讲讲是什么原因吗?希望能得到您的回复,谢谢!
Reply
sban Said on 九月 19th, 2008 at 7:32 上午 quote
to xg:
一、是否在Library Path中正确引用as3corelib.swc。源码libs目录中并未包涵,需自行引用或复制于此。
二、如果一没有问题,swc版本是否不同。我是从svn下载的源码,然后自行编译的。
Reply
xg Said on 九月 21st, 2008 at 8:58 上午 quote
谢谢:sban
我是这样做的:把corelib中的src下的目录直接拷到你的示例的src目录中的,这样编译的时候没有提示任何错误,能通过,并且在表格的下方能显示出jsonfile.txt中的数据,但表格却不能显示jsonfile.txt中的数据。
不知道我这样做是不是出错了?或者能不能再详细介绍下这个corelib的使用方法,最好图解+说明。
再次感谢您的回复,祝:安康!
期待您的再次回复,谢谢!
Reply
sban Said on 九月 22nd, 2008 at 4:04 下午 quote
貌似你的做法没有问题。Clear Project,重新Rebuild一下。如果问题依旧,且没有任何错误爆出的话,到http://code.google.com/p/as3corelib/issues/list提问吧,我也爱莫能助了。
Reply
xg Said on 九月 23rd, 2008 at 8:12 上午 quote
好的,谢谢sban 的热情帮助!
Reply
xg Said on 九月 23rd, 2008 at 11:28 上午 quote
sban:
今天测试例子,又发现一个问题(原来问题解决了):
测试这个例子:http://blog.sban.com.cn/flex/as3corelib/json.html
原来的jsontext为:
[
{"title":"sban blog","url":"http://blog.sban.com.cn/"},
{"title":"flex blogs","url":"http://flexblogs.cn/"},
{"title":"sban studio","url":"http://www.sban.com.cn/"}
]
添加一行后则成了:
[{"url":"无","title":"添加的一行"},{"url":"http://blog.sban.com.cn/","mx_internal_uid":"EC8269FB-DE2F-B993-CE0C-8D3D8763FD38","title":"sban blog"},{"url":"http://flexblogs.cn/","mx_internal_uid":"B5505158-342A-D058-26E4-8D3D87726935","title":"flex blogs"},{"url":"http://www.sban.com.cn/","mx_internal_uid":"7706B2EA-378F-4A5B-C093-8D3D87721BB3","title":"sban studio"}]
其中最重要的是每行多出了”,”mx_internal_uid”,不知道是怎么回事,还请指教!
谢谢!
Reply
sban Said on 九月 23rd, 2008 at 1:45 下午 quote
to xg:
的确有这种情况,源于web变量是动态对象。flex会动态给dynamic object创建一个uid,做为mx_internal_uid属性存在,该属性可以直接用obj.mx_internal_uid访问(在创建之后)。
用UIDUtil可以手动创建uid,一个32位的字符串,几乎没有理由重复。
有三种方法可以避免uid的自动创建:
1,不使用动态对象,自定义一个class,并且该class中至少有一个属性是[Bindable]的。
2,实现IUID接口。
3,不实现2接口也可以,具有一个uid属性,并且有值。
Reply
xg Said on 九月 23rd, 2008 at 3:42 下午 quote
明白了
谢谢sban的热心解答。
另外,刚刚查资料的时候,发现json的string格式不象您的示例当中的,而象下面这种的,多了COLUMNS以及DATA,并且我替换了你的示例,发你corelib中的json并不能解析这个格式,不知道是什么原因,如有空,请解释下行吗?谢谢!
{”COLUMNS”:["ID","TITLE","POSTED"],”DATA”:[["905D9689-0130-1A16-62272F586A771C0C","mmm","May, 15 2007 10:31:00"],["905DAAED-E300-3B9D-7E25E43985CA9507","nn","May, 15 2007 10:31:00"],["905DE931-B8DB-B1AD-F77FC505851C2E9A","j","May, 15 2007 10:31:00"],["905E0C6A-99B8-97EC-4862D9064B9EC659","mmmmm","May, 15 2007 10:31:00"],["905E5910-0E2D-C566-5DCD39E6FD48ED06","NUMBER 11","May, 15 2007 10:32:00"]]}
Reply
Kevin Said on 四月 8th, 2009 at 1:51 下午 quote
A,解码:JSON.decode(obj : Object) : String;
B,编码:JSON.encode(str : String) : Object;
这个是不是反了?编码是把as对象编成字符串方便传输吧,参数应该是Object,返回值是String
Reply