JSON встроен в AS3. Предпочтительный метод передачи данных по проводам - AMF, который предоставляет вам типизированные объекты.
Если вам нужно использовать JSON, то я думаю, что вам, возможно, придется иметь дело с каким-то пользовательским протоколом , чтобы иметь возможность кодировать / декодировать с типами.
На самом деле вам понадобится утилита отражения, которая читает бины в формате JSON и затем создает ваш объект. Это действительно зависит от того, насколько глубоко вы хотите зайти.
as3Commons имеет пакет отражения, который может помочь. У них также есть JSONTypeProvider, который не совсем то, что вам нужно, но может поставить вас в нужное русло.
Вы можете изменить любую из структур IOC для создания контекста, анализируя JSON вместо обычного XML, который большинство из них использует.
Вы можете изменить 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;
}
}