2009-05-22 1 views
6

안녕하세요, 내 JSON 문자열을 사용자 지정 개체로 캐스팅 할 수 있는지 궁금합니다. 기본적으로JSON을 사용자 정의 ActionScript 객체로 캐스팅 하시겠습니까?

:

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

감사 Adlertz

AS3에서
+0

는 제목에 "ActionScript에서"추가 할 수 있습니까? –

+0

액션 스크립트에만 국한된 것은 아니며, 나는 단지 액션 스크립트에서이 스크립트를 사용합니다. –

답변

4

, 당신은 으로 또는 에서는 CustomClass (customObject)를 사용하여 사용자 정의 클래스에 동적 객체를 캐스팅 할 수 없습니다.

그러나 간단한 해결 방법으로 몇 가지 간단한 방법을 사용할 수 있습니다. 예를 들어, Object를 허용하는 사용자 정의 클래스의 생성자를 선언하고 객체 속성으로 멤버를 초기화 할 수 있습니다.

그런 다음 사용합니다 :

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. 이 클래스 패닉이 발생하는 경우가 구축시에 null로 스팸 경우, 실패, 또는 ​​것을 단순히 반환 된 인스턴스의 속성에 익명의 개체 또는 배열을 할당 할 수 있도록 생성자는
  2. 는, 또한 재귀 할 수없는 9 개 이상의 인수를 필요로

greetz

back2dos

0

동적 오브젝트에서 사용자 정의 개체를 캐스팅 할 수 없습니다)는 어쨌든 도움이되기를 바랍니다. 그러나 as3corelib에서 JSON-Decoder를 확장 할 수 있습니다. 나는 정확하게 이런 이유로 그것을했다. json-String을 디코딩 할 때 인코딩 된 객체의 클래스 이름을 전달합니다. 리플렉션을 조금 사용하면 강력한 사용자 정의 된 객체를 다시 얻을 수 있습니다. 물론 디코딩 전에 인코딩 된 객체의 클래스 이름을 알아야합니다.

2

실제로 - 파서에서 빌드를 사용하고 JSON.parse 메소드를 무시하고 익명의 범위를 활용하면이 제한 사항을 다소 해킹 할 수 있습니다 함수를 사용하여 부모 함수의 객체에 액세스합니다. 예를 들어

- MutatorData 클래스는 거의위한 클래스를 만드는의 목적을 패배하는, 동적으로 선언해야합니다 -이 코드를 체크 아웃은 같은 코드 샘플로

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

스 니펫.다른 코더가 속성을 추가하는 것을 막을 수는 없지만 JSON 문자열의 맞춤법 오류는 객체의 속성이됩니다. 심지어 IDE에서 RTTI 및 코드 힌트를 얻을 수 있습니다. 그러면 코더 오류를 방지 할 수 있습니다.

하지만 최종 (비 동적) 클래스에서 사용할 수있는 사용자 지정 버전의 구문 분석 메서드를 작성하는 것이 간단합니다.

프로젝트에

나는 현재하고 있어요 - 메모리와 런타임 성능이 중요한, 우리는 이러한 이유로 사용자 정의 파서를 사용하여 선호 : 그것은 이동 중에도 얻을에서 우리가 엄격한 타입 객체를 변경할 수 있습니다

1) 데이터를 임시 제네릭 객체로 복사하지 않아도됩니다.

2) 유효성 검사기를 파서에 직접 빌드하고 프로그램에 잘못된 JSON 데이터를 수신했음을 알리는 데 필요한 런타임 오류를 발생시킬 수 있습니다.