2011-04-08 74 views
5

我使用.NET的JavascriptSerializer將JSON反序列化爲運行時對象,並且大部分情況下JSON字段和對象字段之間的映射是自動的。但是,我面臨以下情況,並歡迎有關如何處理它的建議。如何處理JSON和變體對象?

想象一下,我們有一個Shape的JSON表示,它可以是Square或Circle。例如,

{"ShapeType":"Circle","Shape":{"Color":"Blue", "Radius":"5.3"}} 

{"ShapeType":"Square","Shape":{"Color":"Red", "Side":"2.1"}} 

這些JSON字符串被如下所示的類層次結構之後建模。

class ShapePacket 
{ 
    public string ShapeType; // either "Square" or "Circle" 
    public Shape Shape; 
} 

class Shape // all Shapes have a Color 
{ 
    public string Color; 
} 

class Square : Shape 
{ 
    public float Side; 
} 

class Circle : Shape 
{ 
    public float Radius; 
} 

簡單地調用JavascriptSerializer.Deserialize在這種情況下,那裏是一個涉及變量類型不起作用。有什麼方法可以哄JavascriptSerializer反序列化,儘管我的數據類型是「分支」?我也對第三方解決方案開放。

+0

看起來像這個問題[與多態對象的數組JSON序列化](http://stackoverflow.com/questions/5186973/json-serialization-of-array-with-polymorphic-objects)。 – R0MANARMY 2011-04-08 17:40:42

回答

2

數據類型中的分支可能需要代碼中的分支。除了明確的方式外,我不相信有辦法做到這一點。

我將分兩個步驟來完成此:

首先,把傳入的JSON對象爲無類型的哈希使用JsonConvert.DeserializeObject

然後,手動在「ShapeType」田分公司選擇合適的ShapeSquareCircle),並自己構建一個實例。

(這裏包括爲子孫後代明確的解決方案,雖然我懷疑你不需要我與它的幫助;)

1

我認爲你需要有JavaScriptTypeResolver實現這樣初始化JavascriptSerializer(SimpleTypeResolver建在類庫中):

new JavaScriptSerializer(new SimpleTypeResolver()); 

爲了啓用自動類型解析。我想因此它會在輸出JSON中添加一個__type字段,稍後它將使用該字段來解析該類型。