代码之家  ›  专栏  ›  技术社区  ›  Franky-D

枚举可能是动态的或可能不是动态的AS3对象的属性

  •  1
  • Franky-D  · 技术社区  · 16 年前

    为了发送POST请求,我需要枚举给定对象的所有属性。此对象可能是动态的,也可能不是动态的。我正在寻找最优雅的解决方案。这就是我到目前为止所得到的:

        function createURLVariables(params:Object):URLVariables
        {
            // Workaround: Flash Player performs a GET if no params are passed
            params ||= {forcePost: true};
            var vars:URLVariables = new URLVariables();
            var propertyName:String;
            var propertyList:XMLList = describeType(params)..variable;
            var propertyListLength:int = propertyList.length();
            // A dynamic object won't return properties in this fashion
            if (propertyListLength > 0)
            {
                for (var i:int; i < propertyListLength; i++)
                {
                    propertyName = propertyList[i].@name;
                    vars[propertyName] = params[propertyName];
                }
            }
            else
            {
                for (propertyName in params)
                    vars[propertyName] = params[propertyName];
            }
            return vars;
        }
    

    一个潜在的问题是,这不会返回getter(访问器)的属性。

    1 回复  |  直到 16 年前
        1
  •  7
  •   darronschall    16 年前

    我采取 the following approach 在 as3corelib JSON编码器。你将不得不修改这个以满足你的需要,但它应该给你一个工作的想法。注意这里有一些递归(convertToString调用,您可能不需要:

    /**
     * Converts an object to it's JSON string equivalent
     *
     * @param o The object to convert
     * @return The JSON string representation of <code>o</code>
     */
    private function objectToString( o:Object ):String
    {
        // create a string to store the object's jsonstring value
        var s:String = "";
        // determine if o is a class instance or a plain object
        var classInfo:XML = describeType( o );
        if ( classInfo.@name.toString() == "Object" )
        {
            // the value of o[key] in the loop below - store this 
            // as a variable so we don't have to keep looking up o[key]
            // when testing for valid values to convert
            var value:Object;
    
            // loop over the keys in the object and add their converted
            // values to the string
            for ( var key:String in o )
            {
                // assign value to a variable for quick lookup
                value = o[key];
    
                // don't add function's to the JSON string
                if ( value is Function )
                {
                    // skip this key and try another
                    continue;
                }
    
                // when the length is 0 we're adding the first item so
                // no comma is necessary
                if ( s.length > 0 ) {
                    // we've already added an item, so add the comma separator
                    s += ","
                }
    
                s += escapeString( key ) + ":" + convertToString( value );
            }
        }
        else // o is a class instance
        {
            // Loop over all of the variables and accessors in the class and 
            // serialize them along with their values.
            for each ( var v:XML in classInfo..*.( 
                name() == "variable"
                ||
                ( 
                    name() == "accessor"
                    // Issue #116 - Make sure accessors are readable
                    && attribute( "access" ).charAt( 0 ) == "r" ) 
                ) )
            {
                // Issue #110 - If [Transient] metadata exists, then we should skip
                if ( v.metadata && v.metadata.( @name == "Transient" ).length() > 0 )
                {
                    continue;
                }
    
                // When the length is 0 we're adding the first item so
                // no comma is necessary
                if ( s.length > 0 ) {
                    // We've already added an item, so add the comma separator
                    s += ","
                }
    
                s += escapeString( v.@name.toString() ) + ":" 
                        + convertToString( o[ v.@name ] );
            }
    
        }
    
        return "{" + s + "}";
    }
    
    推荐文章