2011-10-06 47 views
1

JSON.net並想用一種一致的方式來發送和接收數據(文檔)。JSON.Net - 使用JsonIgnoreAttribute只在序列化(但不是deserialzing時),我們使用

我們希望,所有文件的來源是一個基類。基類有一個DocumentType屬性 - 這實質上是類名。

當客戶端發佈此JSON序列化文件到服務器上,我們要反序列化,並確保客戶端指定中,DocumentType服務器上的ExpectedDocumentType匹配。

然後就像這樣,當這個文檔被服務器序列化併發送到客戶端時,我們希望JSON中包含DocumentType屬性 - 技巧是我們希望這個值是ExpectedDocumentType的值。

我試圖做到這一點像這樣...如果JsonProperty和JsonIgnore屬性僅在序列化過程中產生影響,但不是反序列化,但是不幸的是,情況並非如此。

public abstract class JsonDocument 
{ 
    /// <summary> 
    /// The document type that the concrete class expects to be deserialized from. 
    /// </summary> 
    //[JsonProperty(PropertyName = "DocumentType")] // We substitute the DocumentType property with this ExpectedDocumentType property when serializing derived types. 
    public abstract string ExpectedDocumentType { get; } 


    /// <summary> 
    /// The actual document type that was provided in the JSON that the concrete class was deserialized from. 
    /// </summary> 
    [JsonIgnore] // We ignore this property when serializing derived types and instead use the ExpectedDocumentType property. 
    public string DocumentType { get; set; } 
} 

有誰知道如何做到這一點?

本質上邏輯是客戶端可以在反序列化過程中提供任何DocumentType,服務器需要確保這與ExpectedDocumentType匹配,然後在序列化期間服務器將此文檔發送給客戶端時,服務器知道需要的正確DocumentType使用ExpectedDocumentType填充它。

+0

你使用的是WCF嗎?或只是簡單的舊請求到ASHX或ASPX? –

+0

WCF寧靜的WebServices – Tyler

回答

0

你可以用Enum做到這一點,我不知道DocumentType是一個枚舉,但它應該。

enum DocumentType { 
    XML, 
    JSON, 
    PDF, 
    DOC 
} 

反序列化請求時,如果客戶端向您發送一個無效的枚舉,它會給你一個錯誤。您可以捕獲「InvalidEnumArgumentException」,並告訴客戶端它正在發送無效的DocumentType。

+0

這很有趣,看看不同的人如何解釋不同的名字:) - 這不是數據類型。對於我們的文檔類型會是這樣的「CreateUserDocument」,「UpdateUserDocument」,「UpdateLocationDocument」。我們使用REST,因此我們使用文檔來創建/更新/刪除和表示資源。 – Tyler

+0

好的,我每天都在使用REST創建API,對不起,我不明白你的問題:/。 –

3

使用由Json.Net提供的ShouldSerialize功能。所以基本上,你的班級將如下所示:

public abstract class JsonDocument 
{ 
    /// <summary> 
    /// The document type that the concrete class expects to be deserialized from. 
    /// </summary> 
    //[JsonProperty(PropertyName = "DocumentType")] // We substitute the DocumentType property with this ExpectedDocumentType property when serializing derived types. 
    public abstract string ExpectedDocumentType { get; } 

    /// <summary> 
    /// The actual document type that was provided in the JSON that the concrete class was deserialized from. 
    /// </summary> 
    public string DocumentType { get; set; } 

    //Tells json.net to not serialize DocumentType, but allows DocumentType to be deserialized 
    public bool ShouldSerializeDocumentType() 
    { 
     return false; 
    } 
}