枚举AS3对象的属性,该属性可能是动态的也可能不是动态的

时间:2010-08-04 16:38:11

标签: flex flash actionscript-3 post properties

为了发送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 个答案:

答案 0 :(得分:7)

我在the following approach JSON编码器中取了as3corelib。你必须修改它以满足你的需要,但它应该给你一个工作的想法。请注意,这里有一些递归(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 + "}";
}
相关问题