Apache flex 将ActionScript对象映射到类?
如果我有一堆普通的旧对象,那么将它们映射到一堆类的最佳方法是什么 例如,如果我使用HTTPService拉入一些JSON,然后对其进行反序列化,我将得到一组如下所示的对象:Apache flex 将ActionScript对象映射到类?,apache-flex,actionscript-3,Apache Flex,Actionscript 3,如果我有一堆普通的旧对象,那么将它们映射到一堆类的最佳方法是什么 例如,如果我使用HTTPService拉入一些JSON,然后对其进行反序列化,我将得到一组如下所示的对象: { type: "person", id: 42, name: "David" } 我想把它们变成Person类的实例: class Person { id:int; name:String; } 有没有一些标准的、通用的方法 还要考虑的是:处理对象之间关系的一些标准方法如何?例如,如果此人有其他
{ type: "person",
id: 42,
name: "David" }
我想把它们变成Person类的实例:
class Person {
id:int;
name:String;
}
有没有一些标准的、通用的方法
还要考虑的是:处理对象之间关系的一些标准方法如何?例如,如果此人有其他配偶字段:
{ type: "person", spouse: 61, ... } // Where 61 is the ID of the spouse
谢谢,
David没有标准的方法可以做到这一点,但是你可以用两种不同的方法来解决 版本1:构造函数方法
public class Person {
public function Person(raw:Object=null) {
if (raw != null) {
for ( var key:String in raw ) {
try {
this[key] = raw[key];
} catch (e:Error) {}
}
...
这有点容易出错。如果名为key的属性不存在,分配将失败,如果类型不匹配或无法自动强制,分配也将失败
版本2:flash.utils.describeType
更复杂,让你更能控制。首先,您必须创建Person的实例并调用describeType
var o:Object = { ... } // raw person data
var p:Person = new Person();
var typeDesc:XML = flash.utils.describeType( p );
for (var key:String in o) {
var node:XML = typeDesc.variable.(@name==key)[0];
if ( node != null ) {
// Person class has a property *key*
p[key] = o[key];
}
}
但是在使用getter和setter而不是公共变量时要小心。您不能使用typeDesc.variable访问它们,而是必须使用typeDesc.accessor并检查其访问属性是否为非写属性
关于您的类型键。要动态加载类,可以执行以下操作:
var clazz:Class = flash.utils.getDefinitionByName(raw.type+"");
var person:Person = Person( new clazz() );
当然,只要目标类存在并且正在与项目一起编译或使用SWC动态加载,raw.type可能包含Person或com.package.Person
看看:
及
希望这能有所帮助:没有标准的方法,但是你可以用两种不同的方法来解决 版本1:构造函数方法
public class Person {
public function Person(raw:Object=null) {
if (raw != null) {
for ( var key:String in raw ) {
try {
this[key] = raw[key];
} catch (e:Error) {}
}
...
这有点容易出错。如果名为key的属性不存在,分配将失败,如果类型不匹配或无法自动强制,分配也将失败
版本2:flash.utils.describeType
更复杂,让你更能控制。首先,您必须创建Person的实例并调用describeType
var o:Object = { ... } // raw person data
var p:Person = new Person();
var typeDesc:XML = flash.utils.describeType( p );
for (var key:String in o) {
var node:XML = typeDesc.variable.(@name==key)[0];
if ( node != null ) {
// Person class has a property *key*
p[key] = o[key];
}
}
但是在使用getter和setter而不是公共变量时要小心。您不能使用typeDesc.variable访问它们,而是必须使用typeDesc.accessor并检查其访问属性是否为非写属性
关于您的类型键。要动态加载类,可以执行以下操作:
var clazz:Class = flash.utils.getDefinitionByName(raw.type+"");
var person:Person = Person( new clazz() );
当然,只要目标类存在并且正在与项目一起编译或使用SWC动态加载,raw.type可能包含Person或com.package.Person
看看:
及
希望这有帮助:为了保持整洁和不易出错,我会使用单独的对象来完成这两项任务。例如,要处理转换,可以使用以下对象:
public class PersonFactory
{
function buildFromGenerics(objects:Array):Array
{
var a:Array = [];
var l:int = objects.length;
for (var i:int = 0; i < l; i++)
{
var o:Object = objects[i];
var p:Person = new Person();
p.id = o['id'];
p.name = o['name'];
a[i] = p
}
return a;
}
}
将此步骤的所有逻辑移到一个单独的对象中,可以隔离此功能,它实际上独立于实际的Person对象,因此不存在业务
对于第二种情况,我将使用一个单独的对象来保存其中的所有Person对象,并提供一个检索它们的接口,如下所示:
public class PersonCollection
{
private var _people:Array;
public function setPeople(people:Array):void
{
_people = people;
}
public function getPersonByID(id:int):Person
{
var l:int = _people.length;
for (var i:int = 0; i < l; i++)
{
var p:Person = _people[i];
if (p.id == id)
{
return p;
}
}
return null;
}
}
这种分离有助于保持代码的整洁,还提供了一种简单的方法来处理和管理代码。希望这能有所帮助。为了保持整洁和不易出错,我会使用单独的对象来完成这两项任务。例如,要处理转换,可以使用以下对象:
public class PersonFactory
{
function buildFromGenerics(objects:Array):Array
{
var a:Array = [];
var l:int = objects.length;
for (var i:int = 0; i < l; i++)
{
var o:Object = objects[i];
var p:Person = new Person();
p.id = o['id'];
p.name = o['name'];
a[i] = p
}
return a;
}
}
将此步骤的所有逻辑移到一个单独的对象中,可以隔离此功能,它实际上独立于实际的Person对象,因此不存在业务
对于第二种情况,我将使用一个单独的对象来保存其中的所有Person对象,并提供一个检索它们的接口,如下所示:
public class PersonCollection
{
private var _people:Array;
public function setPeople(people:Array):void
{
_people = people;
}
public function getPersonByID(id:int):Person
{
var l:int = _people.length;
for (var i:int = 0; i < l; i++)
{
var p:Person = _people[i];
if (p.id == id)
{
return p;
}
}
return null;
}
}
这种分离有助于保持代码的整洁,还提供了一种简单的方法来处理和管理代码。希望对您有所帮助。您是否使用AMF接收数据?否。。。如果我使用AMF,这将更容易,但其他方面,特别是服务器端代码将变得更加复杂。您是否使用AMF接收数据?否。。。如果我使用AMF,这将更容易,但具体来说,服务器端代码将变得更加复杂。