ASP.NET Web API で DataContract の利用

0 件のコメント

データコントラクト(DataContract)を利用することで、JSON と C# で作成した クラス との間の シリアライズ、デシリアライズ を自動的に行えるようにします。 ここでは、メッセージボディー に入れられた JSONオブジェクト を C# で作成した モデルクラス へ バインド する方法について記載します。

目次

データコントラクト の実装

データコントラクト(DataContract) は、JSONオブジェクト と モデルクラス の関連付けを定義します。 暗黙的 データコントラクト と、明示的 データコントラクト の2種類が存在します。 暗黙的 データコントラクト は、何も設定がいらず、すべてを公開する方法です。 明示的 データコントラクト は、公開するプロパティに対して明示的な設定を行う方法です。 名称の変更や、非公開設定等ができる方法です。

暗黙的 データコントラクト の実装

  1. "Models" フォルダ を右クリックして、[追加]-[新しい項目] を選択します。
  2. コードファイル を選択し、"Product.cs" を作成ます。
  3. 作成した 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; }
        }
    }
    

明示的 データコントラクト の実装

  1. "参照設定" を右クリックして、[参照の追加] を選択します。
  2. "参照の追加" ダイアログ の [.NET] のタブで、 "System.Runtime.Serialization" を選択します。
  3. [OK] を選択して、 "System.Runtime.Serialization" への参照を追加します。
  4. "Models" フォルダ を右クリックして、[追加]-[新しい項目] を選択します。
  5. [クラス] を選択します。
  6. 作成した 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}]

今回、以下のサイトを参考にしました。