Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

WCFWebAPI で、指定の REST Format に適合する JSON を返す方法を説明する。

はじめに

出力したい JSON フォーマットを確認する

まず、どのようなフォーマットの JSON を出力したいのかを確認します。
これがなければ、始まりません。

出力したい JSON に合わせて、クラスやプロパティを定義する

次に、出力したい JSON に合わせて、クラスやプロパティを定義します。

基本

基本的には、以下のルールに従って、クラスやプロパティを定義します。

ルール

出力したいJSON定義するクラス・プロパティ
{ "key1" : "value1", "key2" : "value2" }public class Sample
{
    string key1 { get; set; }
    string key2 { get; set; }
}
[ "1", "2", "3" ]List<string> listData { get; set; }
{ "key1" : [ "1", "2", "3" ] }public class Sample
{
    List<string> key1 { get; set; }
}
{ "key" : { "key1" : "value1", "key2" : "value2" } }public class Sample
{
    string key1 { get; set; }
    string key2 { get; set; }
}
public class Sample2
{
    Sample key { get; set; }
}
[ { "key1" : "value1", "key2" : "value2" },
{ "key1" : "value3", "key2" : "value4" } ]
public class Sample
{
    string key1 { get; set; }
    string key2 { get; set; }
}
List<Sample> listData { get; set; }

JSONを返すサービスを作成する

WCF の場合

WCF で JSON を返す場合、既定では DataContractJsonSerializer? が使用されます。

以下に注意して下さい。

既定の DataContractJsonSerializer? を使用して JSON を返す方法

DataContractJsonSerializer? 以外の Serializer を使用して JSON を返す方法

WCF における REST(JSON) 処理の参考情報

WebサイトをIIS以下に配置した場合に例外が発生

以下の例外(メッセージ)が出力されることがある。

ASP.NET との互換性がないため、サービスをアクティブにできません。
このアプリケーションでは、ASP.NET との互換性が有効になっています。
web.config 内で ASP.NET の互換性モードを無効にするか、
RequirementsMode に Allowed または Required が設定されたサービスの型に、
AspNetCompatibilityRequirements 属性を追加してください。

この場合、

にあるように、サービスのクラスに、
AspNetCompatibilityRequirements? 属性を追加する。

ASP.NET Web API の場合

ASP.NET Web API は、既定で JSON.NET によって Serialize されます。
このため、Dictionary 型も問題なく Serialize できます。

Java など、他プラットフォームとの相互運用

Java などの他プラットフォームとの相互運用を考えた場合も、まずは出力したい JSON フォーマットを確認することが基本です。

つまり、以下のような流れとなります。

  1. 出力したい JSON フォーマットを決める
    (これがデータコントラクトとなる)
  2. そのフォーマットにあわせて、
    1. Java であれば POJO、
    2. .NET であれば POCO

クラスを作成する。

POJO または POCO をデータコントラクトとすべきでない理由

.NET と Java では、JSON シリアライザの挙動が違います。

言語POJO / POCO サンプルシリアライズされた JSON
Javapublic class Sample {
    public String _key1;
    public String _key2;
    public void setKey1(String key1) {
        this._key1 = key1;
    }
    public String getKey1() {
        return this._key1;
    }
    public void setKey2(String key2) {
        this._key2 = key2;
    }
    public String getKey2() {
        return this._key2;
    }
}
{ "key1" : "value1", "key2" : "value2" }
public class Sample {
    public HashMap?<String, String> _key;
    public void setKey(HashMap?<String, String> key) {
        this._key = key;
    }
}
.NETpublic class Sample {
    public string key1 { get; set; }
    public string key2 { get; set; }
}
public class Sample {
    public Dictionary<string, string> key { get; set; }
}
[
    {
        "Key": "Prop1",
        "Value": "Value1"
    },
    {
        "Key": "Prop2",
        "Value": "Value2"
    }
]

同じ形式のジェネリック型であっても、
Java と .NET ではシリアライズ結果が異なる

参考 (Microsoft Azure が公開している REST API サンプル)

数個、Microsoft Azure が公開している REST API をピックアップしてみました。

これらの REST API でも、JSON のフォーマットが明記されています。
このことからも、JSON フォーマットレベルでデータコントラクトを結ぶ必要があると思います。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS