2012-03-12 13 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> 

私は今、私はデフォルトの内側のオブジェクトの名前を変更することができます注釈セットを必要とし、たとえば、surnamemsurnameに変更したいとします。

[XmlElement("msurname")] 

注釈を、私のリクエストのAcceptヘッダは(もちろん)application/xmlが含まれている場合のみが動作する:私は、次を追加しようとしています。私は完全に無視される[DataMember]注釈を試して使用しました。

WebAPIのこのApiControllerで、XML形式とJSON形式の両方にシリアル化するアノテーションセットがありますか?ありがとうございました。

EDIT:補正私は[DataMember][DataContract]アノテーションを使用している場合、私はなく、XMLと、JSONのシリアライズを用いて所望の動作を得ます。私が[XmlElement]を使用すると、逆のことが起こります。

答えて

5

を使用すると、データメンバーを見ている動作です。ただし、JSONはデフォルトでJSONDataContractSerializerを使用します。しかし、将来的にはそうではありません。あなたはそのように

GlobalConfiguration.Config.Formatters.XmlDataContractSerializer = true; 

を設定することにより、XmlDataContractSerializerにXMLを変更することができ、両方のJSONとXML形式は、DataContractSerializerを使用します。

+2

偉大な、ありがとう! 'Global.asax.cs Application_Start'に以下の行を入れました。(あなたが提案したものと少し異なります):' GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseDataContractSerializer = true; ' – frapontillo

+0

ところで、将来のデフォルトの動作ですか? JSONはXmlSerializerと同じスーパークラスのシリアライザを使用しますか? – frapontillo

+1

@MacGyverいいえ。デフォルトのJSONシリアライザをJSON.Netに置き換えることを考えています。ただし、必要なものだけを使用するように、Formattersコレクションをいつでも変更できます。 –

0

2つのシリアライザは、などの列の名前を変更処理するために

を異なる属性を使用するのですあなたは現在両方の属性を持っている必要がありますことを統一する方法はありません。

ただし、他の属性を認識する別のXML/JSONシリアライザを使用することもできます。あなたはまた、DataAnnotationsを試してみて、シリアライザは、それらを認識した場合、それは動作します

+0

'[DisplayName(" msurname ")]'は実際に何も変わらない、私はまだXMLとJSONの両方のシリアル化で "姓"を取得する。 – frapontillo

0

の方法は、あなたがフォーマッタに対処されることがある表示される場合があります

UPDATE
。取得しているXMLデータはXmlMediaTypeFormatterXmlMediaTypeFomatter Class)です。

私はあなたが説明しているように組み込み機能を認識していませんが、独自のフォーマッタを書くのはかなり簡単です。ここで

カスタムフォーマッタの実装の一例である、あなたのアイデアを取得します:デフォルトのWebAPIのでXmlSerializerを、ないDataContractSerializerを使用しているため

Using JSON.NET with ASP.NET Web API

+0

はい、私はむしろそれを簡単に保つでしょう。私は、デフォルトのシリアライザが隠されているので、デフォルトのシリアライザのすべてで考慮された何らかの種類のアノテーションスーパークラスがあることを期待していました。 – frapontillo

+1

@MacGyver Darrel Millerのほうが良い答えがあります。 – tugberk

関連する問題