您好我想知道是否可以将我的JSON字符串转换为自定义对象?
基本上:
var customObject:CustomObject = JSON.decode(evt.result as String) as CustomObject;
关心Adlertz
答案 0 :(得分:4)
在AS3中,您无法使用作为或 CustomClass(customObject)将动态对象强制转换为自定义类。
但是,您可以使用一些简单的技巧作为解决方法。 例如,您可以为自定义类声明一个接受Object的构造函数,并使用对象属性初始化它的成员。
然后您将使用:
var customObject:CustomClass = new CustomClass(JSON.decode(evt.result as String));
PS。关于评论,对于每种语言都不是这样......我想这会使 actionscript特定。
答案 1 :(得分:3)
本身,这是不可能的。这与ActionScript无关。在大多数其他语言中,你有同样的问题,因为在左侧你有一个匿名对象,如果语言支持任何这样的东西,或哈希。 无论如何。有不同的解决方案,这可以是一个,可以处理一些事情:
package {
public class ObjectUtils {
public static function createInstance(constructor:Class):* {
var ret:*;
switch (describeType(to).factory.constructor.parameter.(@optional == "false").length()) {
case 0: ret = new to(); break;
case 1: ret = new to(null); break;
case 2: ret = new to(null, null); break;
case 3: ret = new to(null, null, null); break;
case 4: ret = new to(null, null, null, null); break;
case 5: ret = new to(null, null, null, null, null); break;
case 6: ret = new to(null, null, null, null, null, null); break;
case 7: ret = new to(null, null, null, null, null, null, null); break;
case 8: ret = new to(null, null, null, null, null, null, null, null); break;
case 9: ret = new to(null, null, null, null, null, null, null, null, null); break;
default: throw new Error("no implementation for instantiating classes that require more than 9 constructor arguments");
}
return ret;
}
public static function castAnonymous(obj:Object, to:Class):* {
var ret = createInstance(obj);
for (var name:String in obj)
try {
ret[name] = obj[name];
}
catch (e:Error) {
throw new Error("error trying to assign value " + obj[name] + " to property " + name + " on " + ret + ". reason: " + e);
}
return ret;
}
}
}
限制:
希望它无论如何都有帮助;)
格尔茨
back2dos
答案 2 :(得分:2)
实际上 - 您可以使用内置解析器并覆盖JSON.parse
方法并利用匿名函数的范围访问父函数中的对象来解决此限制。
例如 - 查看此代码段
public dynamic class MutatorData extends Object
{
public var DisplayName:String;
public var PropertyName:String;
}
public function parseData( data:String )
{
var mutator:MutatorData = new MutatorData();
JSON.parse( data,
function (k, v) {
mutator[k] = v;
});
}
使用代码示例原样 - MutatorData类必须声明为动态,ALMOST失败了为它创建类的目的。您将无法阻止其他编码器向其添加属性,JSON字符串中的拼写错误将成为对象的属性。 Evenso,您将在IDE中获得一些RTTI和代码提示 - 这有助于防止编码器错误。
但是编写一个可以与最终(非动态)类一起使用的parse方法的自定义版本是一件简单的事情。
在我目前正在研究的项目上 - 内存和运行时性能至关重要,我们更喜欢使用自定义解析器,原因如下:
1)它允许我们在一开始就改变严格类型的对象,并放弃将数据复制到临时通用对象中。
2)我们可以将验证器构建到解析器中,根据需要抛出运行时错误,以通知程序我们收到错误的JSON数据。
答案 3 :(得分:2)
答案 4 :(得分:0)
您无法从动态对象强制转换自定义对象。 但是你可以从as3corelib扩展JSON-Decoder。我之所以这么做是因为这个原因。当我解码json-String时,我传递了编码对象的类名。通过稍微使用反射,您可以获得强大的自定义对象。当然,您需要在解码之前知道编码对象的类名...