2017-02-28 72 views
1

我剛剛花了很長時間試圖完成這項工作,所以我會在這裏發帖,以防其他人與我犯相同的錯誤。爲什麼我的抽象JSON對象不被解析?

所以,複製的情況,我只是有幾類基本繼承:

public abstract class Foo 
{ 
    public string Name { get; set; } 
} 

public class Bar : Foo 
{ 
    public int SomethingSpecial { get; set; } 
} 

public class Baz : Foo 
{ 
    public string SomethingMundane { get; set; } 
} 

現在,我希望能夠把一個JSON字符串,並解析回一個具體實施Foo,事先不知道json代表了哪種類型。 JSON.Net處理此,通過使用$類型變量來查找對象的類型:

{ 
    "$type": "MyNamespace.Bar", 
    "Name": "Resources", 
    "SomethingSpecial": 42 
} 

當反序列化對象,你可能想指定類型處理選項和定製綁定,在JsonSerializerSettings中,但這是可選的。

我遇到的問題是,當從web客戶端發佈json時,該對象沒有被反序列化,而是引發異常,或者在ASP.Net中的POST參數的情況下,該值只是進來作爲null

回答

2

這裏的問題是,Newtonsoft.Json(至少我使用的版本 - 9.0.1)預計$類型元素爲對象的第一元素,將忽略它的時候它在任何其他位置。所以下面的JSON,雖然在技術上等同於問題的JSON,將無法正常工作:

{ 
    "Name": "Resources", 
    "$type": "MyNamespace.Bar", 
    "SomethingSpecial": 42 
} 

此設置,雖然它可能會影響性能:

new JsonSerializerSettings 
{ 
    // $type no longer needs to be first 
    MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead 
} 

值得注意的是,如果您使用的是JavaScript的JSON.stringify函數,屬性通常會按照它們首次分配給該對象的順序寫出,因此您還可以確保第一件事是分配$類型