我正在使用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?
答案 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 );