ASP.NET Web API 2 でAPIの戻り値として JSON の返却方法
ASP.NET Web API 2 でAPIの戻り値として JSON を返却するコードを紹介します。
概要
ASP.NET Web API 2でクラスオブジェクトをWeb APIの戻り値に設定すると、オブジェクトの値をJSON形式で返すことができます。
なお、クライアントのAcceptヘッダーに基づいてレスポンスの形式を決定するため、Webブラウザによっては、XMLでのレスポンスになる場合があります。
この場合は、JSONフォーマッタを追加し、XMLフォーマッタを削除するコードを記述します。
プログラム例:2024年版
ファイル作成、配置
空のASP.NET アプリケーションを作成します、作成時にWeb APIのオプションを有効にします。
作成後、コントローラーを作成します。名称は"DefaultController"とします。また、返却値用のクラスを作成します。名称は "MyItem"クラスとします。
コード
以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Mime;
using System.Web.Http;
namespace SimpleWebApi.Controllers
{
public class MyItem
{
public int ID { get; set; }
public string Name { get; set; }
public int Price { get; set; }
}
public class DefaultController : ApiController
{
public MyItem[] Get()
{
MyItem m1 = new MyItem() { ID = 1, Name = "ぺんぎんクッキー", Price = 130 };
MyItem m2 = new MyItem() { ID = 2, Name = "らくだキャラメル", Price = 85 };
MyItem m3 = new MyItem() { ID = 3, Name = "かるがもビスケット", Price = 220 };
return new MyItem[]{ m1,m2,m3};
}
}
}
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace SimpleWebApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API の設定およびサービス
// Web API ルート
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "ValuesApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// JSON フォーマッタを優先する設定
var jsonFormatter = config.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.Remove(config.Formatters.XmlFormatter);
}
}
}
解説
DefaultControllerクラスは、オブジェクトの配列を戻り値にするメソッドを一つ実装しています。
コードは
こちらの記事で紹介している動作と同じです。
WebApiConfig.cs ファイルの Registerメソッドに以下のコードを追記します。
// JSON フォーマッタを優先する設定
var jsonFormatter = config.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.Remove(config.Formatters.XmlFormatter);
実行結果
プロジェクトを実行し
(ASP.NETアプリケーションルートURL)/api/Default/
にアクセスします。
下図の結果が表示されます。MyItemオブジェクトの複数の値が配列形式のJSONで整形されたレスポンスが返ります。
[
{
"id": 1,
"name": "ぺんぎんクッキー",
"price": 130
},
{
"id": 2,
"name": "らくだキャラメル",
"price": 85
},
{
"id": 3,
"name": "かるがもビスケット",
"price": 220
}
]
APIの戻り値のレスポンスをJSON形式で出力できました。
プログラム例:2018年版
補足
ASP.NET Web API 2 を利用し、Internet Explorer でアクセスした場合は、オブジェクトをAPIのレスポンスとして設定した場合、
デフォルトでJSON形式でレスポンスが返りますが、ASP.NET Web API 2.1でMicrosoft Edgeを利用した場合には、デフォルトの状態ではXML形式でレスポンスが返ります。
明示的にJSON形式でレスポンスを返す場合は、先に紹介した、JSON フォーマッタを追加して、XMLフォーマッタを削除するコードを追記する必要があります。
ファイル作成、配置
空のASP.NET アプリケーションを作成します、作成時にWeb APIのオプションを有効にします。
作成後、コントローラーを作成します。名称は"DefaultController"とします。また、返却値用のクラスを作成します。名称は "MyItem"クラスとします。コントローラーはControllersフォルダ、返却値用のオブジェクトのクラスはModelsフォルダに配置しましたが、このフォルダ以外の配置でも問題ないようです。
コード
返却値用のクラス(MyItem.cs)を実装します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ObjectResultWebApi.Models
{
public class MyItem
{
public string name;
public int count;
public double price;
public string code;
}
}
コントローラーを実装します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace ObjectResultWebApi.Models
{
public class DefaultController : ApiController
{
public MyItem GetItem()
{
MyItem item = new MyItem();
item.name = "ペンギンクッキー";
item.count = 8;
item.price = 280;
item.code = "PC-01W";
return item;
}
}
}
WebApiConfigのコードは変更はせず、生成されたコードをそのまま利用します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace ObjectResultWebApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API の設定およびサービス
// Web API ルート
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
解説
DefaultControllerに実装したGetItemメソッドはWeb APIの引数なしの呼び出しがあった際に実行され、戻り値を返します。
戻り値はGetItem内で設定した、下記コードの値になります。メソッドの戻り値をMyItemクラスとし、メソッド内で作成して値を代入したインスタンスオブジェクトをメソッドの戻り値とします。
public MyItem GetItem()
{
MyItem item = new MyItem();
item.name = "ペンギンクッキー";
item.count = 8;
item.price = 280;
item.code = "PC-01W";
return item;
}
実行結果
プロジェクトを実行します。ページが存在しないため、下図の Forbidden エラーが表示されます。
(Webアプリけションのルート)/api/Default/
URLにアクセスします。jsonファイルのダウンロードが表示されます。
jsonファイルをダウンロードします。
jsonファイルがダウンロードできました。
ダウンロードしたjsonファイルを開いて内容を確認します。
jsonファイルは以下の内容です。
{
"name":"ペンギンクッキー",
"count":8,
"price":280.0,
"code":"PC-01W"
}
コントローラーのコードに記述して設定した値がAPIの戻り値で返却できていることが確認できます。
Web APIでクラスオブジェクトを戻り値に指定し、JSON形式の戻り値を返すWeb APIを実装できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用