2010-03-05 57 views
2

我想我已經在as3corelib中建立了JSON.decode我別無選擇,只能對一個普通的舊flex對象進行反序列化。類型反序列化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中包含的數據?

我的第二個問題,如果是這樣,那麼在我編寫我自己的方法來做到這一點之前,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樹,開始在葉子。 對於循環引用,您需要一個技巧。 我有這個地方的實現,但我找不到它。