Тип AS3 JSON кодер и декодер? - PullRequest
3 голосов
/ 23 апреля 2011

Мне нужно кодировать и декодировать объекты AS3 типизированным способом.http://code.google.com/p/as3corelib/ поддерживает только нетипизированное кодирование и декодирование.http://code.google.com/p/ason/ поддерживает некоторые типизированные объекты, но не очень надежен, например, не работает с объектами Date.Любые Рекомендации?

Чтобы было ясно: это ДОЛЖЕН быть JSON, и он ДОЛЖЕН быть строго типизированным и надежным.

Ответы [ 6 ]

2 голосов
/ 05 мая 2011

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;

    }


}
1 голос
/ 04 мая 2011

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 ​​, чтобы добавить поддержку пользовательских классов.

0 голосов
/ 28 мая 2015

Необходимо рассмотреть две операции: 1) сериализацию объекта определенного типа в JSON и 2) десериализацию строки JSON в объект определенного типа.

Часть сериализации проста -просто используйте встроенный JSON.stringify ().Десериализация строки JSON в объект определенного типа в ActionScript - это то, где она становится интересной (и где ответ на ваш вопрос).Вам нужно написать свою собственную функцию десериализации для тех классов, которые вам нужно будет десериализовать.В этой функции вам необходимо предоставить функцию восстановления для JSON.parse () , которая позволяет настроить способ десериализации 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), возвращаязначение как есть.

0 голосов
/ 05 мая 2011

Я теперь разветвил часть json http://code.google.com/p/as3corelib/ и добавил поддержку типизированных объектов ...

0 голосов
/ 04 мая 2011

JSON не реализован во флэш-виртуальной машине, и поэтому нет типизированного объекта "JSON", как есть "Xml". Так что в принципе вы можете прекрасно декодировать JSON, но тип, который вы собираетесь получить, это Object. Вы можете получить к ним доступ, используя ключ объекта в качестве ассоциативного массива.

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

Официальный JSON lib / utils из Adobe: http://code.google.com/p/as3corelib/source/browse/#svn%2Ftrunk%2Fsrc%2Fcom%2Fadobe%2Fserialization%2Fjson

Насколько хорошо. :)

0 голосов
/ 23 апреля 2011

JSON на самом деле не определяет средства для передачи информации о типе.Это просто строки, целые, массивы и так далее.Так что в основном вам нужно что-то вроде «рассола» для AS3, которое основано на JSON.Я бы посоветовал вам взглянуть на решения для удаленного взаимодействия Flex / Flash и посмотреть, как они упаковывают объекты для передачи в RPC;Возможно, вы сможете изменить это решение для использования JSON.Я на самом деле сомневаюсь, что вы найдете такую ​​библиотеку.Это должен быть JSON?Я уверен, что есть библиотеки на основе XML, которые делают это.

...