我需要以键入的方式编码和解码AS3对象。 http://code.google.com/p/as3corelib/仅支持无类型编码和解码。 http://code.google.com/p/ason/支持某种类型的对象,但不是很健壮,例如它在日期对象上失败。任何建议书?
说清楚:它必须是JSON,它必须是强类型和强大的。
答案 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部分并添加了类型对象支持...