键入AS3 JSON编码器和解码器?

时间:2011-04-23 14:09:56

标签: actionscript-3 json strong-typing typed

我需要以键入的方式编码和解码AS3对象。 http://code.google.com/p/as3corelib/仅支持无类型编码和解码。 http://code.google.com/p/ason/支持某种类型的对象,但不是很健壮,例如它在日期对象上失败。任何建议书?

说清楚:它必须是JSON,它必须是强类型和强大的。

6 个答案:

答案 0 :(得分:2)

JSON内置于AS3中。通过网络传输数据的首选方法是AMF,它确实为您提供了类型化的对象。

如果你必须使用JSON,那么我猜你可能需要使用某种自定义协议才能使用类型进行编码/解码。

您实际上需要一个以JSON格式读取bean然后生成对象的反射实用程序。这实际上取决于你想要的深度。

as3Commons有一个可以提供帮助的反射包。它们还有一个JSONTypeProvider,它不是你需要的,但可以把你带到正确的道路。

您可以通过解析JSON而不是大多数使用的常规XML来修改任何IOC框架来生成上下文。

您可以修改ASON并添加自定义类型解析器。您必须在包含对象类型的JSON对象中发送变量。并将其与flash.utils.getDefinitionByName一起使用。

另一种方法是使用常规JSON解析器解析对象,然后如果它具有已定义的类型,则创建该对象的实例,并初始化属性。

这样的事情,让你开始:

var beanInfo:Object = JSON.decode( jsonString );
beanInfo = _parseBean( beanInfo );

private function _parseBean(beanInfo:Object):Object{
    if ( beanInfo.hasOwnProperty("_type") ) {
        var clazz:Class = getDefinitionByName( beanInfo._type ) as Class;
        beanInfo.__clazz = clazz;
        var instance:Object = new clazz;
        for( var prop:String in beanInfo ) {
            if( instance.hasOwnProperty(prop) ) target[prop] = _getPropertyFrom(beanInfo[prop]);
        }
    }
}

private function _getPropertyFrom(property:String):* {
    var xml:XML = describeType( beanInfo.__clazz );
    //find the type of the current property.
    var type:String = xml...
    //if is a simple object then do something like
    switch( type ) {
        case "number":
            return parseFloat(property ) as Number;
        break;
        case "int":
        case "uint":
            return parseInt( property );
        break;
        case "string":
            return property as String;
        break;
        ...
        default
            //As it is it does not suppor complex objects.
           //You would use reflection. But then you could save the whole switch...

        break;

    }


}

答案 1 :(得分:1)

Flash有自己的序列化系统。

var serializer:ByteArray = new ByteArray();
serializer.writeObject(new Sprite());
serializer.position = 0;
var data:String = serializer.readUTFBytes(serializer.bytesAvailable);
trace(data); //Will show you the binary jibberish

您可以使用registerClassAlias添加对自定义类的支持。

答案 2 :(得分:0)

JSON确实没有定义传达类型信息的方法。它只是字符串,整数和数组等等。所以基本上你需要某种基于JSON的基于 的AS3的“pickle”。我建议你研究一下Flex / Flash远程处理解决方案,看看他们如何打包为RPC传输的对象;您可以修改该解决方案以使用JSON。我真的很怀疑你会找到这样的图书馆。它必须是JSON吗?我很确定有基于XML的库可以做到这一点。

答案 3 :(得分:0)

JSON未在Flash虚拟机中实现,因此没有类型化对象“JSON”,因为存在“Xml”。所以基本上你可以很好地解码JSON,但你要获得的类型是Object。您可以使用对象中的键作为关联数组来访问数据。

http://blog.alien109.com/2009/02/11/php5-json-as3corelib-a-beautiful-thing/

来自adobe的JSON lib / utils官员: http://code.google.com/p/as3corelib/source/browse/#svn%2Ftrunk%2Fsrc%2Fcom%2Fadobe%2Fserialization%2Fjson

尽可能好。 :)

答案 4 :(得分:0)

您需要考虑两个操作:1)将特定类型的对象序列化为JSON,2)将JSON字符串反序列化为特定类型的对象。

序列化部分很简单 - 只需使用内置的JSON.stringify()。在ActionScript中将JSON字符串反序列化为特定类型的对象是令人感兴趣的地方(问题的答案在哪里)。您需要为反序列化所需的classe编写自己的反序列化函数。在该函数中,您需要为JSON.parse()提供一个reviver函数,它允许您自定义JSON的反序列化方式。

例如:

    public static function deserializeComplexObject(json:String):ComplexObject
    {
        if (null == json || "null" == json)
        {
            return null;
        }
        var complexObject:ComplexObject = new ComplexObject();
        var parsedObject:Object = JSON.parse(
            json,
            function (key:String, value:Object):*
            {
                switch (key)
                {
                    case “keyForNumber”:
                        return value;
                    case “keyForComplexObject2”:
                        return deserializeComplexObject2(JSON.stringify(value));
                    case “keyForComplexObject3”:
                        return deserializeComplexObject3(JSON.stringify(value));
                    case “keyForString”:
                        return value;
                    case “keyForBoolean”:
                        return value;
                    default:
                        return value;
                }
            }
        );
        complexObject.keyForNumber = parsedObject.keyForNumber;
        complexObject.keyForComplexObject2 = parsedObject.keyForComplexObject2;
        // continue setting fields
        // …
        return complexObject;
    }

每个case语句对应于JSON字符串中的顶级键。对于每个键,实际上并不需要单独的case语句 - 您可以使用默认大小写来处理映射到作为简单类型之一(Object,Array,String,Number,Boolean,null)的值的所有键,方法是返回按原样价值。

答案 5 :(得分:-1)

我现在已经分叉http://code.google.com/p/as3corelib/的json部分并添加了类型对象支持...