Перечислите свойства объекта AS3, которые могут быть или не быть динамическими - PullRequest
1 голос
/ 04 августа 2010

Чтобы отправить запрос 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;
    }

Одна потенциальная проблема заключается в том, что это не вернет свойства для получателей (аксессоров).

1 Ответ

7 голосов
/ 04 августа 2010

Я взял следующий подход в as3corelib JSON Encoder.Вам придется изменить это в соответствии с вашими потребностями, но это должно дать вам идею для работы.Обратите внимание, что здесь есть некоторая рекурсия (вызов 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 + "}";
}
...