2012-03-12 32 views
3

我正在用新的Microsoft MVC 4 ApiController class and WebAPI構建RESTful Web服務。 我有一個Person類:更改ASP .NET MVC 4的內部對象的名稱WebAPI序列化(XML/JSON)

public class Person 
{ 
    public string surname { get; set; } 
    public string name{ get; set; } 
} 

和默認的HTTP GET方法的工作,返回以下:

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <surname>John</surname> 
    <name>Titor</name> 
</Person> 

我現在需要一個註解集,它可以讓我改變默認的內部對象的名稱,例如,我想將surname更改爲msurname。我曾嘗試加入以下內容:

[XmlElement("msurname")] 

註釋,但只有當我的請求的Accept頭包含application/xml(當然)的作品。我試過並使用了[DataMember]註釋,這是完全忽略的。

是否有一個註釋集可以在WebAPI中使用此ApiController進行XML和JSON格式的序列化?謝謝。

編輯:修正,如果我用[DataMember][DataContract]註釋,我得到JSON序列化所需的行爲,但不與XML。如果我使用[XmlElement],會發生相反的情況。

回答

5

您正在使用數據成員看到的行爲是因爲默認情況下的WebAPI使用XmlSerializer的,而不是DataContractSerializer的。不過,JSON目前默認使用JSONDataContractSerializer。但在未來它不會。您可以通過設置

GlobalConfiguration.Config.Formatters.XmlDataContractSerializer = true; 

這樣改變XML的XmlDataContractSerializer,無論是JSON和XML格式將使用DataContractSerializer的。

+2

太好了,謝謝!我已經在我的'Global.asax.cs Application_Start'中放入了下面一行(與你所建議的不同):'GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseDataContractSerializer = true;' – frapontillo 2012-03-12 12:44:17

+0

順便說一下,未來的默認行爲? JSON會使用與XmlSerializer具有相同超類的序列化程序嗎? – frapontillo 2012-03-12 12:54:24

+1

@MacGyver號他們正在尋找用JSON.Net替換默認的JSON序列化程序。但是,您始終可以將Formatters集合更改爲僅使用所需的集合。 – 2012-03-12 14:00:45

0

兩個串行確實使用不同的屬性來處理列等

的重命名沒有辦法統一,你將需要有兩個屬性存在。

然而,您可以使用不同的XML/JSON序列化程序來識別其他屬性。

UPDATE
您也可以嘗試DataAnnotations,看看串行識別它們

+0

'[DisplayName(「msurname」)]'實際上沒有改變,我仍然在XML和JSON序列化中都得到「姓氏」。 – frapontillo 2012-03-12 09:57:32

0

它的工作方式是,你將處理格式化程序。您獲得的XML數據由XmlMediaTypeFormatterXmlMediaTypeFomatter Class)生成。

我沒有意識到任何內置功能,但您可以很容易地編寫自己的格式化程序。

這裏是一個自定義的格式實現的例子,你會得到的想法:

Using JSON.NET with ASP.NET Web API

+0

是的,但我寧願保持簡單。我希望有一種由所有默認序列化器考慮的註釋超類,因爲默認的序列化系統是隱藏的。 – frapontillo 2012-03-12 10:08:51

+1

@MacGyver達雷爾米勒有一個更好的答案。 – tugberk 2012-03-12 11:46:59

相關問題