如何在Flex中解码和转换JSON字符串?

时间:2009-09-20 01:51:03

标签: flex actionscript-3 json

我正在使用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 个答案:

答案 0 :(得分:3)

您需要执行类似于此页面所述的内容:http://benrimbey.wordpress.com/2009/06/20/reflection-based-json-validation-with-vo-structs/

您的代码存在的问题是您正在尝试将本机Object转发为它不知道的特定Class实例。两种类型的结构是不同的。 UserInfo继承自Object(由于编译类的方式,以某种时髦的AS3方式),但b是一个简单的Object。

答案 1 :(得分:2)

仅供参考,如果您只是进行JSON解码,它是一个Flex应用程序,而不是AIR。您不需要as3Corelib包来执行此操作。你可以像这样使用父浏览器的JavaScript解释器:

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

这可能会在下载时为您的用户节省几Kb。

答案 2 :(得分:1)

格伦的链接确实做到了。我还添加了dot-net和AS3之间的转换 - 似乎dot-net像这样写了__type属性:“Class:Namespace”,但AS3需要它像:“Namespace.Class”。

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

顺便说一句,如果您使用的是Glenn的链接和WCF服务器,请务必将“clientClassPath”替换为dot-net的“__type”。

答案 3 :(得分:0)

也可以在VO的构造函数中进行转换。

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 );