データコントラクト(DataContract)を利用することで、JSON と C# で作成した クラス との間の シリアライズ、デシリアライズ を自動的に行えるようにします。 ここでは、メッセージボディー に入れられた JSONオブジェクト を C# で作成した モデルクラス へ バインド する方法について記載します。
目次
データコントラクト の実装
データコントラクト(DataContract) は、JSONオブジェクト と モデルクラス の関連付けを定義します。 暗黙的 データコントラクト と、明示的 データコントラクト の2種類が存在します。 暗黙的 データコントラクト は、何も設定がいらず、すべてを公開する方法です。 明示的 データコントラクト は、公開するプロパティに対して明示的な設定を行う方法です。 名称の変更や、非公開設定等ができる方法です。
暗黙的 データコントラクト の実装
- "Models" フォルダ を右クリックして、[追加]-[新しい項目] を選択します。
- コードファイル を選択し、"Product.cs" を作成ます。
- 作成した Product.cs に、以下の コード を記載します。
namespace MvcApplication1.Models { using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; public class Product { public string id { get; set; } public string name { get; set; } public int price { get; set; } } }
明示的 データコントラクト の実装
- "参照設定" を右クリックして、[参照の追加] を選択します。
- "参照の追加" ダイアログ の [.NET] のタブで、 "System.Runtime.Serialization" を選択します。
- [OK] を選択して、 "System.Runtime.Serialization" への参照を追加します。
- "Models" フォルダ を右クリックして、[追加]-[新しい項目] を選択します。
- [クラス] を選択します。
- 作成した Product.cs に、以下の コード を記載します。
namespace MvcApplication1.Models { using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using System.Runtime.Serialization; [DataContract] public class Product { [DataMember(Name="id")] public string ID { get; set; } [DataMember(Name="name")] public string Name { get; set; } [DataMember(Name="price")] public int Price { get; set; } [IgnoreDataMember] public string Memo { get; set; } } }
データコントラクト を利用した サービス の実装
namespace MvcApplication1.Controllers { using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using MvcApplication1.Models; public class CatalogController : ApiController { // GET api/catalog public IEnumerable<Product> Get() { return new Product[]{ new Product(){ ID="00001", Name="鉛筆", Price=98 }, new Product(){ ID="00002", Name="シャーペン", Price=198 } }; } // POST api/catalog/{id} public void Post(string id, [FromBody]Product product) { return product; } } }
テスト 実行
Fiddler の Composer 等でテストしてみます。 以下は GET 受信データのサンプルです。
HTTP/1.1 200 OK Server: ASP.NET Development Server/10.0.0.0 Date: Sun, 10 Nov 2013 07:27:15 GMT X-AspNet-Version: 4.0.30319 Cache-Control: no-cache Pragma: no-cache Expires: -1 Content-Type: application/json; charset=utf-8 Content-Length: 95 Connection: Close [{"id":"00001","name":"鉛筆","price":98},{"id":"00002","name":"シャーペン","price":198}]
今回、以下のサイトを参考にしました。
- The Official Microsoft ASP.NET Site - JSON and XML Serialization
- Stack Overflow - WebAPI POST [FromBody] not binding
- Stack Overflow - How to use Datacontract attribute to add namespaces and change the xml root node in mvc4 api
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!