データコントラクト(DataContract)を利用することで、JSON と C# で作成した クラス との間の シリアライズ、デシリアライズ を自動的に行えるようにします。 ここでは、メッセージボディー に入れられた JSONオブジェクト を C# で作成した モデルクラス へ バインド する方法について記載します。
目次
データコントラクト の実装
データコントラクト(DataContract) は、JSONオブジェクト と モデルクラス の関連付けを定義します。 暗黙的 データコントラクト と、明示的 データコントラクト の2種類が存在します。 暗黙的 データコントラクト は、何も設定がいらず、すべてを公開する方法です。 明示的 データコントラクト は、公開するプロパティに対して明示的な設定を行う方法です。 名称の変更や、非公開設定等ができる方法です。
暗黙的 データコントラクト の実装
- "Models" フォルダ を右クリックして、[追加]-[新しい項目] を選択します。
- コードファイル を選択し、"Product.cs" を作成ます。
- 作成した Product.cs に、以下の コード を記載します。
123456789101112131415161718
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 に、以下の コード を記載します。
1234567891011121314151617181920212223242526
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
; }
}
}
データコントラクト を利用した サービス の実装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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 の フォロー」 お願いします!!