안녕하세요, 내 JSON 문자열을 사용자 지정 개체로 캐스팅 할 수 있는지 궁금합니다. 기본적으로JSON을 사용자 정의 ActionScript 객체로 캐스팅 하시겠습니까?
:
var customObject:CustomObject = JSON.decode(evt.result as String) as CustomObject;
감사 Adlertz
AS3에서안녕하세요, 내 JSON 문자열을 사용자 지정 개체로 캐스팅 할 수 있는지 궁금합니다. 기본적으로JSON을 사용자 정의 ActionScript 객체로 캐스팅 하시겠습니까?
:
var customObject:CustomObject = JSON.decode(evt.result as String) as CustomObject;
감사 Adlertz
AS3에서, 당신은 으로 또는 에서는 CustomClass (customObject)를 사용하여 사용자 정의 클래스에 동적 객체를 캐스팅 할 수 없습니다.
그러나 간단한 해결 방법으로 몇 가지 간단한 방법을 사용할 수 있습니다. 예를 들어, Object를 허용하는 사용자 정의 클래스의 생성자를 선언하고 객체 속성으로 멤버를 초기화 할 수 있습니다.
그런 다음 사용합니다 :
var customObject:CustomClass = new CustomClass(JSON.decode(evt.result as String));
PS합니다. 코멘트에 관해서는, 이것은 모든 언어를 위해 진실하지 않다 ... 나는 그것이 특정한 스크립트을 만든다고 생각한다.
본질적으로 이것은 불가능합니다. 그리고 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;
}
}
}
제한 : 다른 솔루션은,이 몇 가지 처리 할 수, 하나가 될 것이다있다
greetz
back2dos
동적 오브젝트에서 사용자 정의 개체를 캐스팅 할 수 없습니다)는 어쨌든 도움이되기를 바랍니다. 그러나 as3corelib에서 JSON-Decoder를 확장 할 수 있습니다. 나는 정확하게 이런 이유로 그것을했다. json-String을 디코딩 할 때 인코딩 된 객체의 클래스 이름을 전달합니다. 리플렉션을 조금 사용하면 강력한 사용자 정의 된 객체를 다시 얻을 수 있습니다. 물론 디코딩 전에 인코딩 된 객체의 클래스 이름을 알아야합니다.
실제로 - 파서에서 빌드를 사용하고 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 데이터를 수신했음을 알리는 데 필요한 런타임 오류를 발생시킬 수 있습니다.
는 제목에 "ActionScript에서"추가 할 수 있습니까? –
액션 스크립트에만 국한된 것은 아니며, 나는 단지 액션 스크립트에서이 스크립트를 사용합니다. –