Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 将ActionScript对象映射到类?_Apache Flex_Actionscript 3 - Fatal编程技术网

Apache flex 将ActionScript对象映射到类?

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; } 有没有一些标准的、通用的方法 还要考虑的是:处理对象之间关系的一些标准方法如何?例如,如果此人有其他

如果我有一堆普通的旧对象,那么将它们映射到一堆类的最佳方法是什么

例如,如果我使用HTTPService拉入一些JSON,然后对其进行反序列化,我将得到一组如下所示的对象:

{ 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,这将更容易,但具体来说,服务器端代码将变得更加复杂。