Как декодировать и приводить строку JSON во Flex? - PullRequest
5 голосов
/ 20 сентября 2009

Я использую as3corelib для декодирования / кодирования строк JSON. В моем маленьком эксперименте я хочу закодировать объект (UserInfo) в строку JSON и декодирование его обратно в объект, однако, кажется, что он не работает в точке преобразования (последняя строка), почему это произошло? как я могу заставить это работать?

Класс UserInfo

public class UserInfo
{
    public var levelProgress    : int;
}

Код конверсии

var user1:UserInfo = new UserInfo() 
user1.levelProgress = 20;

var a:String = JSON.encode(user1);
var b:Object = JSON.decode(a);
var c:UserInfo;

c = b as UserInfo;  // c gets null, why?

Ответы [ 4 ]

3 голосов
/ 20 сентября 2009

Вам нужно сделать что-то похожее на то, что написано на этой странице: http://benrimbey.wordpress.com/2009/06/20/reflection-based-json-validation-with-vo-structs/

Проблема с вашим кодом в том, что вы пытаетесь преобразовать нативный объект в определенный экземпляр класса, о котором он ничего не знает. Структуры ваших двух типов различны. UserInfo наследуется от Object (в некотором роде в стиле AS3 из-за способа компиляции классов), но b является простым Object.

2 голосов
/ 24 ноября 2010

К вашему сведению, если вы просто выполняете декодирование JSON, и это приложение Flex, а не AIR. Вам не нужен пакет as3Corelib для этого. Вы можете просто использовать интерпретатор JavaScript родительского браузера следующим образом:

var myJSONString:String = "{name:'Joe',age:35}"; var myObj:Object = ExternalInterface.call('eval', "("+myJSONString+")");

Это может сэкономить пользователю несколько килобайт при загрузке.

1 голос
/ 20 сентября 2009

Ссылка Гленна действительно сделала свое дело. Я также добавил преобразование между dot-net и AS3 - кажется, что dot-net записывает атрибут __type примерно так: «Class: Namespace», но AS3 нужно, чтобы он был примерно таким: «Namespace.Class».

private static function convertDotNetToASNameType(nameType:String):String            
{
    return(nameType.split(':').reverse().join('.'));
}

Кстати, если вы используете ссылку Гленна и сервер WCF, обязательно замените "clientClassPath" на "__type" dot-net.

0 голосов
/ 30 октября 2010

Может также выполнить приведение в конструкторе ВО.

public class YourVO
{

    public var id:int;
    public var prop1:String;
    public var prop2:String;
    public var prop3:String;

    public function YourVO(jsonObject : Object)
    {
        for (var p:String in jsonObject) {
            if( this.hasOwnProperty(p) ){
                this[p] = jsonObject[p];
            }
        }
    }

}

и используйте его так:

var yourVO:YourVO = new YourVO( jsonObject );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...