【问题标题】:Cast JSON as a custom ActionScript object?将 JSON 转换为自定义 ActionScript 对象?
【发布时间】:2009-05-22 12:17:29
【问题描述】:

您好,我想知道是否可以将我的 JSON 字符串转换为自定义对象?

基本上:

var customObject:CustomObject = JSON.decode(evt.result as String) as CustomObject;

问候阿德勒茨

【问题讨论】:

  • 能否在标题中添加“in ActionScript”?
  • 它不是特定于 actionscript 的,我只是碰巧在 actionscript 中使用它。

标签: flash actionscript-3 json object casting


【解决方案1】:

在 AS3 中,您不能使用 asCustomClass(customObject) 将动态对象转换为自定义类。

但是,您可以使用一些简单的技巧作为解决方法。 例如,您可以为您的自定义类声明一个构造函数,接受一个对象并使用对象属性初始化它的成员。

然后你会使用:

var customObject:CustomClass = new CustomClass(JSON.decode(evt.result as String));

PS。关于 cmets,并非每种语言都如此......我想这使得它 actionscript 特定

【讨论】:

    【解决方案2】:

    就其本身而言,这是不可能的。这与 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;
            }               
        }   
    }
    

    限制:

    1. 如果您的类出现恐慌、在构造时使用空值向其发送垃圾邮件或构造函数需要 9 个以上的参数,则会失败
    2. 没有,也不能递归,所以它可以简单地将匿名对象或数组分配给返回的实例的属性

    无论如何希望它有所帮助;)

    问候

    back2dos

    【讨论】:

      【解决方案3】:

      实际上 - 您可以使用内置解析器并覆盖 JSON.parse 方法并利用匿名函数的范围来访问父函数中的对象来绕过此限制。

      例如 - 查看这段代码 sn-p

      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 类必须声明为动态的,这几乎违背了为其创建类的目的。您将无法阻止其他编码人员向其添加属性,JSON 字符串中的拼写错误将成为对象的属性。 Evenso,您将在 IDE 中获得一些 RTTI 和代码提示 - 这有助于防止编码器错误。

      但是编写一个自定义版本的 parse 方法可以与最终(非动态)类一起使用将是一件简单的事情。

      在我目前正在进行的项目中 - 内存和运行时性能至关重要,我们更喜欢使用自定义解析器,原因如下:

      1) 它允许我们一开始就更改严格类型的对象,并放弃将数据复制到临时通用对象中。

      2) 我们可以将验证器直接构建到解析器中,根据需要抛出运行时错误以通知程序我们收到了不正确的 JSON 数据。

      【讨论】:

        【解决方案4】:

        有办法

        github 上的as3-vanilla lib,非常好:)

        https://github.com/jonnyreeves/as3-vanilla

        【讨论】:

          【解决方案5】:

          您不能从动态对象投射自定义对象。 但是您可以从 as3corelib 扩展 JSON-Decoder。我这样做正是出于这个原因。当我解码一个 json-String 时,我传递了编码对象的类名。稍微使用反射,您就可以返回一个强类型的自定义对象。当然解码前需要知道编码对象的类名...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-27
            • 2023-03-11
            • 2011-01-15
            • 2015-10-09
            • 2021-07-02
            • 2021-02-02
            相关资源
            最近更新 更多