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,可视为一个名值对。可以如下描述:

{posts:[
{
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代码:

var jsonObj : Object = {};
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,给它添加了一些信息。它编码之后成为:

{”name”:”sban”,”techniques”:["ruby","php","dotnet",["flex","flash","silverlight",{"javascript":"ajax"}]],”country”:”china”,”city”:”beijing”,”gameinfo”:”跑跑卡丁车,传奇,诛仙”}

从这个例子,可以看出并非所有都是名/值对。值有时可能是一个数组,如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

Last Modified

This entry was posted on 2008年08月30号 and is filed under technique. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

9 Responses to “sban : how to use json with as3corelib in flex”

  1. sban:
    你好,我下载了你的例子并测试,Grid中并不会显示数据呀,并且另外一个例子的结果也和您不一样,我的结果如下:
    {”gameinfo”:”跑跑卡丁车,传奇,诛仙”,”country”:”china”,”techniques”:["ruby","php","dotnet",["flex","flash","silverlight",{"javascript":"ajax"}]],”name”:”sban”,”city”:”beijing”}

    能讲讲是什么原因吗?希望能得到您的回复,谢谢!

    Reply

  2. to xg:
    一、是否在Library Path中正确引用as3corelib.swc。源码libs目录中并未包涵,需自行引用或复制于此。
    二、如果一没有问题,swc版本是否不同。我是从svn下载的源码,然后自行编译的。

    Reply

  3. 谢谢:sban

    我是这样做的:把corelib中的src下的目录直接拷到你的示例的src目录中的,这样编译的时候没有提示任何错误,能通过,并且在表格的下方能显示出jsonfile.txt中的数据,但表格却不能显示jsonfile.txt中的数据。
    不知道我这样做是不是出错了?或者能不能再详细介绍下这个corelib的使用方法,最好图解+说明。
    再次感谢您的回复,祝:安康!
    期待您的再次回复,谢谢!

    Reply

  4. 貌似你的做法没有问题。Clear Project,重新Rebuild一下。如果问题依旧,且没有任何错误爆出的话,到http://code.google.com/p/as3corelib/issues/list提问吧,我也爱莫能助了。

    Reply

  5. 好的,谢谢sban 的热情帮助!

    Reply

  6. 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

  7. 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

  8. 明白了
    谢谢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

  9. A,解码:JSON.decode(obj : Object) : String;
    B,编码:JSON.encode(str : String) : Object;
    这个是不是反了?编码是把as对象编成字符串方便传输吧,参数应该是Object,返回值是String

    Reply

Leave a Reply