API インターフェイスを作成する場合、Web API はデフォルトでオブジェクトをシリアル化して XML 形式で返します。次に、2 つの方法を示します。
方法 1: (設定メソッドを変更する)
検索します。 Global.asax ファイルを編集し、Application_Start() メソッドに文を追加します:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
変更後:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); // 使api返回为json GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); }
この方法で返される結果はすべて json 型ですが、返される結果が String 型の場合は欠点があります。 123 などの場合、返される JSON は「123」になります。
解決策は、戻り値の型をカスタマイズすることです (戻り値の型は HttpResponseMessage)
public HttpResponseMessage PostUserName(User user) { String userName = user.userName; HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(userName,Encoding.GetEncoding("UTF-8"), "application/json") }; return result; }
方法 2: (万金油メソッド)
方法 1 は次のようにする必要があります。設定も変更しましたが、戻り値がString型のjsonも扱う必要があるので、Web APIで自動シリアル化オブジェクトを使用せず、自分でシリアル化してから返す方が良いです
public HttpResponseMessage PostUser(User user) { JavaScriptSerializer serializer = new JavaScriptSerializer(); string str = serializer.Serialize(user); HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") }; return result; }
メソッド。これらの数行のコードは各インターフェイスで繰り返し書かれるため、メソッドにカプセル化する方がはるかに便利です。
public static HttpResponseMessage toJson(Object obj) { String str; if (obj is String ||obj is Char) { str = obj.ToString(); } else { JavaScriptSerializer serializer = new JavaScriptSerializer(); str = serializer.Serialize(obj); } HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") }; return result; }
方法 3: (最も面倒な方法)
方法 1 は最も単純ですが、返された XML 形式がすべて破棄されます。その場合、メソッド 3 は API インターフェイス内の XML を破棄することしかできません。
最初に戻りを処理するクラスを作成します:
public class JsonContentNegotiator : IContentNegotiator { private readonly JsonMediaTypeFormatter _jsonFormatter; public JsonContentNegotiator(JsonMediaTypeFormatter formatter) { _jsonFormatter = formatter; } public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters) { var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json")); return result; } }
次のコードを追加します:
var jsonFormatter = new JsonMediaTypeFormatter(); config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); var jsonFormatter = new JsonMediaTypeFormatter(); config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter)); }
実際、Web API は返されたオブジェクトを xml 形式と json 形式が混在する形式に自動的に変換します。方法 1 と 3 は xml 戻り値を排除し、方法 2 は戻り値をカスタマイズします。