2013-01-12 21 views
20

JSONスタイルの小文字の名前を持つWeb APIのアクションメソッドからオブジェクトを返す場合は、プロパティ名のエイリアスを設定してC#オブジェクト以下のJSONオブジェクトのようになります。ASP.Net Web APIの応答モデルプロパティをエイリアスする方法はありますか

C#応答モデル

public class Account 
    { 
     public int Id { get; set; } 
     public string AccountName { get; set; } 
     public decimal AccountBalance { get; set; } 

    } 

私はあなたがこれだけJSONで動作しますJSON.NETのJsonProperty

public class Account 
    { 
     [JsonProperty(PropertyName="id")] 
     public int Id { get; set; } 
     [JsonProperty(PropertyName="account-name")] 
     public string AccountName { get; set; } 
     [JsonProperty(PropertyName="account-balance")] 
     public decimal AccountBalance { get; set; } 
    } 

を使用することができます

{ 
     "id" : 12, 
     "account-name" : "Primary Checking", 
     "account-balance" : 1000 
    } 

答えて

40

を返すことがしたいJSON明らかに.NET。あなたがよりとらわれないこと、および他の潜在的なフォーマッタ(すなわち、あなたが何か他のものにJSON.NETを変更、またはXMLシリアル化のためだろう)のことができるようにするための命名のこのタイプを持っているしたい場合は、System.Runtime.Serializationと使用を参照:

[DataContract] 
public class Account 
    { 
     [DataMember(Name="id")] 
     public int Id { get; set; } 
     [DataMember(Name="account-name")] 
     public string AccountName { get; set; } 
     [DataMember(Name="account-balance")] 
     public decimal AccountBalance { get; set; } 
    } 
+0

、適用することに注意して ' [DataContract] 'をクラスに追加するには、直列化したい*すべてのプロパティの' [DataMember] '属性が必要です。私。既定で列挙されている10個のプロパティを持つクラスから始め、クラスに '[DataContract]'を追加し、そのプロパティに '[DataMember(Name =" a-new-name ")]'を追加すると、プロパティはもうシリアル化されません。 – AronVanAmmers

+0

、どのようにモデル名(アカウント、ここ)を変更しますか? – sepehr

16

上記のフィリップスの答えは、シリアライゼーションをきめ細かく制御する必要がある場合に最適ですが、グローバルな変更を行う場合は、下に示すような1つのライナーで行うことができます。 I以下のコメントをもとに

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); 
     config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
      new CamelCasePropertyNamesContractResolver(); // This line will cause camel casing to happen by default. 
    } 
} 

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_camelcasing

編集 は先に行って、ここに完全なソリューションでブログ記事を追加しました:このソリューションのユーザーのためにhttp://www.ryanvice.net/uncategorized/extending-json-net-to-serialize-json-properties-using-a-format-that-is-delimited-by-dashes-and-all-lower-case/

+0

これは良いアイデアであり、すべての属性を定義するよりもはるかに簡単ですが、OPが要求したものではありません。それはダッシュのことを解決しません。 – justabuzz

+0

@Ryanあなたのリンクは機能していませんでした。現在は、ここにあります:http://www.vicesoftware.com/uncategorized/extending-json-net-to-serialize-json-properties-using-a-format-that-大文字と小文字の区別がついています。 – DHFW