2009-05-22 3 views
6

Здравствуйте, мне было интересно, можно ли нарисовать мою строку JSON как пользовательский объект?Включить JSON как пользовательский объект ActionScript?

в основном:

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

С уважением Adlertz

+0

Вы можете добавить "в ActionScript" в названии? –

+0

это не actioncript, я просто использую его в actionscript. – 2009-05-22 13:12:05

ответ

4

В AS3, вы не можете бросить динамический объект пользовательского класса с использованием как или CustomClass (customObject).

Вы можете, однако, использовать некоторые простые трюки в качестве обходного пути. Например, вы можете объявить конструктор для своего пользовательского класса, принимающего объект, и инициализировать его элементы с помощью свойств объекта.

Вы использовали бы:

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

PS. Что касается комментариев, это не относится к каждому языку ... Я предполагаю, что это делает действительным окном.

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

ограничение:

  1. утратит, если ваш класс паникует, если это спам с нулями по строительству, или конструктор нуждается в более чем 9 аргументов
  2. не, а также не может RECURSE, поэтому он может просто назначить анонимные объекты или массивы к свойствам возвращаемого экземпляра

надеюсь, что это помогает в любом случае;)

Greetz

back2dos

0

Вы не можете бросить пользовательские объекты из динамических объектов. Но вы можете расширить JSON-декодер от as3corelib. Я сделал это именно по этой причине. Когда я декодирую json-String, я передаю имя класса закодированного объекта. С небольшим использованием рефлексии вы получаете сильный типизированный пользовательский объект назад. Конечно, вам нужно знать имя класса закодированного объекта перед декодированием ...

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 должен быть объявлен динамический, что ПОЧТИ побеждает цель создания класса для него.Вы не сможете предотвратить добавление к нему других кодеров, ошибки орфографии в вашей строке JSON станут свойствами объекта. Evenso, вы получите RTTI и подсказки кода в среде IDE, что может помочь предотвратить ошибку кодера.

Но было бы легко написать пользовательскую версию метода parse, которая будет работать с окончательным (нединамическим) классом.

О проекте В настоящее время я работаю над - память и производительность во время исполнения имеет решающие значение, и мы предпочитаем, используя пользовательские парсер по этим причинам:

1) Это позволяет нам изменять строго типизированный объект на получить ходу и не копировать данные во временный общий объект.

2) Мы можем построить валидатор прямо в синтаксическом анализаторе, забрасывая ошибки во время выполнения, если необходимо, чтобы уведомить программу, мы получаем неправильные данные JSON.

Смежные вопросы