2010-03-05 4 views
2

as3corelib JSON.decode에서 설정 한 것 같아요. 평범한 구형의 flex 객체로 deserialise하는 것 외에는 선택의 여지가 없습니다.deserialised JSON에 대한 가장 좋은 방법

var data:Object = JSON.decode(json); 

개체에 포함 된 데이터를 다른 형식으로 가져 오려면 형식 변환을 사용할 수 없습니다. 새 인스턴스를 인스턴스화하고 속성을 수동으로 추가해야합니다.

var data:Object = JSON.decode(json); 
var model:Model = new Model(); 
model.name = data.name; 
model.notes = data.notes; 

고통과 추악한 조금,하지만이 같은데요은 플렉스 유형이 지정되지 않은 JSON에서가 지불 할 수있는 가격입니다. 나의 첫 번째 질문은 내 가정이 맞는지, json 내에 포함 된 데이터로 모델 인스턴스를 만드는 더 좋은 방법이 없는가하는 점이다.

내 두 번째 질문은 이렇게하기 전에 내 자신의 메서드를 작성하기 전에 데이터 개체를 가져 와서 모델 인스턴스에 값을 mix하는 Flex API 내부에 무엇이 있습니까?

건배,

크리스

답변

1

당신은 당신의 분야 내에서 루프는 객체를 디코딩 모델로를 지정 JSON 수 있습니다

function json2model(json:String):Model{ 
var data:Object = JSON.decode(json); 

var m:Model=new Model(); 

for (var field:String in data) { 
    if (m.hasOwnProperty(field)) { 
    m[field] = data[field]; 
    } 
} 

return m; 
} 

var model:Model=json2model(json) 

또는 모델 내에서 정적 함수를 추가하면 경우 preffer :

public class Model { 
//... 
public static function fromJSon(json:String):Model { 
    var data:Object = JSON.decode(json); 

    var m:Model=new Model(); 

    for (var field:String in data) { 
     if (m.hasOwnProperty(field)) { 
     m[field] = data[field]; 
     } 
    } 

    return m; 
    } 
} 
} 

var model:Model=Model.fromJSon(json); 
2

내가 항상 사용해온 접근 방식은 ActionScript의 AMF3 직렬화 메커니즘의 일부입니다.

IExternalizableregisterClassAlias입니다.

interface ISerializable { 
    public function getRawData():Object; 
    public function setRawData(param:Object):void; 
} 
function registerType(id:String, type:Class):void { 
    //implementation 
} 
function getTypeByID(id:String):Class { 
    //implementation 
} 
function getTypeID(type:Class):String { 
    //implementation 
} 

당신이 클래스의 별칭을 등록 디코더/인코더 :

지금 내가 사용하는 것은 다음과 같다. 다음과 같이 객체의

직렬화 작동 다음과 같이

var raw:Object = model.getRawData(); 
raw[" type"] = getTypeID(model); 
var encoded:String = JSON.encode(raw); 

디코딩이 작동합니다

var raw:Object = JSON.decode(raw); 
var cl:Class = getTypeByID(raw[" type"]); 
if (cl == null) throw new Error("no class registered for type: "+raw[" type"]); 
delete raw[" type"]; 
var model:ISerializable = new cl(); 
model.setRawData(raw); 

당신은 잎에서 시작, 전체 직렬화 된 JSON 트리에 재귀 적으로이 작업을 수행해야합니다. 주기적으로 참조하려면 트릭이 필요합니다. 어딘가에서이 구현을했지만 찾지 못했습니다.